Unity2D游戏开发:实现角色射击功能的完整教程
创作时间:
作者:
@小白创作中心
Unity2D游戏开发:实现角色射击功能的完整教程
引用
CSDN
1.
https://blog.csdn.net/qq_55048532/article/details/139041279
本文将详细介绍在Unity2D中实现角色射击功能的完整流程,包括创建子弹预制体、添加碰撞体积、编辑敌人和子弹脚本、创建角色射击动画以及控制碰撞检测等关键步骤。
一、创建子弹预制体
- 创建子弹预制体
- 调整图片大小、层级
二、为子弹添加碰撞体积
- 添加Box Collider 2D、Rigidbody 2D组件
- 锁定z轴
三、编辑敌人脚本
注:在以下代码中,只显示本章节新增的代码,省略原有的代码
- 为敌人添加生命等基础属性
public class Enemy : MonoBehaviour
{
// 定义敌人的最大生命值和当前生命值
private int maxHealthPoint = 100;
public int healthPoint;
}
- 初始化:给当前生命值赋值
public class Enemy : MonoBehaviour
{
// 定义敌人的最大生命值和当前生命值
private int maxHealthPoint = 100;
public int healthPoint;
void Start()
{
// 为当前生命值赋值
healthPoint = maxHealthPoint;
}
}
- 为敌人添加改变生命值的方法
public class Enemy : MonoBehaviour
{
// 定义敌人的最大生命值和当前生命值
private int maxHealthPoint = 100;
public int healthPoint;
void Start()
{
// 为当前生命值赋值
healthPoint = maxHealthPoint;
}
// 敌人改变生命值
public void changeHealthPoint(int value)
{
healthPoint = Mathf.Clamp(value, 0, maxHealthPoint);
if(healthPoint <= 0) {
Destroy(gameObject);
}
}
}
四、编辑子弹脚本
- 创建刚体对象、初始时获取刚体组件
注意:此时使用Awake方法而不是Start方法,Awake方法会在物体实例化时立刻调用,而Start方法不会
public class Bullet : MonoBehaviour
{
// 创建刚体对象
private Rigidbody2D rigidbody2d;
void Awake()
{
// 获取刚体组件
rigidbody2d = GetComponent<Rigidbody2D>();
}
}
- 添加发射子弹方法,传递一个二维向量(力的方向)和浮点数(力的大小)做为参数
public class Bullet : MonoBehaviour
{
// 创建刚体对象
private Rigidbody2D rigidbody2d;
void Awake()
{
// 获取刚体组件
rigidbody2d = GetComponent<Rigidbody2D>();
}
// 发射子弹方法
public void launch(Vector2 direction, float force)
{
rigidbody2d.AddForce(direction * force);
}
}
- 添加子弹击中敌人的方法
此时Destroy(gameObject)语句没有放在if判断语句中,说明无论子弹与什么物体发生碰撞,都会销毁。(下文将设置碰撞层级,取消子弹和Ruby、河流之间的碰撞)
public class Bullet : MonoBehaviour
{
// 创建刚体对象
private Rigidbody2D rigidbody2d;
void Awake()
{
// 获取刚体组件
rigidbody2d = GetComponent<Rigidbody2D>();
}
// 发射子弹方法
public void launch(Vector2 direction, float force)
{
rigidbody2d.AddForce(direction * force);
}
// 击中敌人方法
private void OnCollisionEnter2D(Collision2D collision)
{
Enemy enemy = collision.gameObject.GetComponent<Enemy>();
if (enemy != null) {
enemy.changeHealthPoint(-25);
}
Destroy(gameObject);
}
}
五、编辑角色脚本
- 创建子弹预制体对象
public class Ruby : MonoBehaviour {
// 创建子弹对象
public GameObject bulletPrefab;
}
- 新建发射子弹的方法
创建子弹游戏对象,将子弹预制体实例化,创建子弹对象,获取子弹游戏物体的C#脚本组件,调用子弹对象的launch方法,再触发Shoot参数(目前没有,文章后面会创建)
public class Ruby : MonoBehaviour {
// 创建子弹对象
public GameObject bulletPrefab;
// Ruby发射子弹
private void shoot()
{
GameObject bulletObject = Instantiate(bulletPrefab, rb2d.position, Quaternion.identity);
Bullet bullet = bulletObject.GetComponent<Bullet>();
bullet.launch(lookDirection, 300);
animator.SetTrigger("Shoot");
}
}
- 当按下空格键时,Ruby调用射击函数,实现射击功能
public class Ruby : MonoBehaviour {
// 创建子弹对象
public GameObject bulletPrefab;
void Update()
{
// Ruby射击
if(Input.GetKeyDown(KeyCode.Space)) {
shoot();
}
}
// Ruby发射子弹
private void shoot()
{
GameObject bulletObject = Instantiate(bulletPrefab, rb2d.position, Quaternion.identity);
Bullet bullet = bulletObject.GetComponent<Bullet>();
bullet.launch(lookDirection, 300);
animator.SetTrigger("Shoot");
}
}
六、创建Ruby射击的动画混合树
动画混合树详细教程:【Unity】动画混合树
- 打开Animator窗口,新建一个Shoot混合树(红色)
- 新建一个Trigger类型的参数Shoot(蓝色)
- 建立Move和Idle通向Shoot的连接,并添加条件为Shoot,建立Shoot通向Idle的连接,不添加任何条件(黄色)
- 新建四个Ruby射击的AnimationClip文件(上下左右),添加到Shoot混合树的四个Motion中(红色)
- 将混合类型修改为2D简单方向,将两个参数修改为LookX和LookY(蓝色)
- 修改四个Motion的两个参数(黄色)
- 在Ruby的Animator窗口中,将指向Shoot的的箭头取消退出时间,将过渡时间缩短为0
七、将bullet预制体挂载到Ruby创建的bulletPrefab对象
八、通过层级控制碰撞检测
- 点击Ruby游戏对象,进入层级控制设置,点击添加层
- 添加两个层级:player层、bullet层和background层
- 将Ruby的层级设置为player
- 将bullet的层级设置为bullet
- 将TileMap的层级设置为background
- 点击Edit,进入Project Settings面板
- 点击Physics选项,Layer Collision Matrix,取消bullet层和bullet层、player层、background层的碰撞
九、子弹的销毁
注:在以下代码中,只显示本标题新增功能的代码,省略原有的代码
- 添加Ruby游戏物体
public class Bullet : MonoBehaviour
{
// 创建ruby游戏物体
public GameObject ruby;
}

- 获取Ruby游戏物体


public class Bullet : MonoBehaviour

{
// 创建ruby游戏物体

public GameObject ruby;

void Awake()

{
// 获取Ruby游戏物体

ruby = GameObject.Find("Ruby");
}
}
- 新增销毁子弹逻辑:若子弹离Ruby过远,则删除子弹;
magnitude方法是获取二维向量的模长;此if判断的含义是:若子弹到坐标轴原点的距离(即模长)减去Ruby到坐标原点的距离大于12(此时可认为Ruby和子弹之间近似的距离大于12),则删除子弹
public class Bullet : MonoBehaviour
{
// 创建ruby游戏物体
public GameObject ruby;
void Awake()
{
// 获取Ruby游戏物体
ruby = GameObject.Find("Ruby");
}
void Update()
{
// 若子弹离Ruby过远时,销毁子弹
if(rigidbody2d.transform.position.magnitude - ruby.transform.position.magnitude > 12) {
Destroy(gameObject);
}
}
}
本章完。感谢阅读!
热门推荐
南安最值得一去的六点!
秦始皇之死:千古之谜与无尽思考
胃不舒服,恶心想吐?试试6种食物缓解不适
柴胡舒肝丸这样搭,肝气舒畅了,脾胃舒服了,睡眠也安稳了
新学期攻略:超实用的班级管理表格大合集
个性化家居装修:打造与自己风格契合的独特设计
为什么Windows用着总是很卡顿?具体的原因及解决方法
狠毒女人:剖析命案背后的心理与动机
艺术与自然的交融:植物艺术家分享动植物王国的奇妙之美
国内 5000 公里换机油,欧洲 2-3 万公里才换机油,差在哪?
收评:指数午后探底回升 人形机器人板块拉升走高
三国志注引用的主要文献
如何合理兑换货币并降低风险?这样的兑换操作有哪些注意事项?
使用低成本蓝牙HID硬件实现自动化脚本
新房逆势涨价,二手房降价抛售,2025年合肥楼市"冰火两重天"
捕捉波段交易,他只用了三根K线!
天干坐地支吗,天干和地支之间相生相克关系解析
高质量午休有诀窍 速来get这些技能
数学课堂如何解析教学重难点
车窗自动升降功能使用指南:从基本操作到安全注意事项
近十年好评如潮的9部日漫,随便一部都是殿堂级神作
找不到钥匙该怎么办?找不到钥匙后有哪些应对措施?
舌头上出现白色小泡泡怎么办?三种常见原因及处理方法
城市TOD战略的公共参与机制探讨
小白必看!2025浙江省考时间安排和考试流程
情感与学业并行:龙门学校说说高中生如何处理情感问题不影响学业
五花肉不只是餐桌上的诱惑,还有这些营养秘密!
探索“筱”字的读音、意义及其文化深意与应用
“戒酒芯片”临床试验成功,为酒精依赖治疗带来新希望
结膜干燥症按其原因可分为哪几型