问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Unity2D游戏开发:实现角色射击功能的完整教程

创作时间:
作者:
@小白创作中心

Unity2D游戏开发:实现角色射击功能的完整教程

引用
CSDN
1.
https://blog.csdn.net/qq_55048532/article/details/139041279

本文将详细介绍在Unity2D中实现角色射击功能的完整流程,包括创建子弹预制体、添加碰撞体积、编辑敌人和子弹脚本、创建角色射击动画以及控制碰撞检测等关键步骤。

一、创建子弹预制体

  1. 创建子弹预制体
  2. 调整图片大小、层级

二、为子弹添加碰撞体积

  1. 添加Box Collider 2D、Rigidbody 2D组件
  2. 锁定z轴

三、编辑敌人脚本

注:在以下代码中,只显示本章节新增的代码,省略原有的代码

  1. 为敌人添加生命等基础属性
public class Enemy : MonoBehaviour
{
    // 定义敌人的最大生命值和当前生命值
    private int maxHealthPoint = 100;
    public int healthPoint;
}  
  1. 初始化:给当前生命值赋值
public class Enemy : MonoBehaviour
{
    // 定义敌人的最大生命值和当前生命值
    private int maxHealthPoint = 100;
    public int healthPoint;
    void Start()
    {
        // 为当前生命值赋值
        healthPoint = maxHealthPoint;
    }
}  
  1. 为敌人添加改变生命值的方法
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);
        }
    }
}  

四、编辑子弹脚本

  1. 创建刚体对象、初始时获取刚体组件
    注意:此时使用Awake方法而不是Start方法,Awake方法会在物体实例化时立刻调用,而Start方法不会
public class Bullet : MonoBehaviour
{
    // 创建刚体对象
    private Rigidbody2D rigidbody2d;
    void Awake()
    {
        // 获取刚体组件
        rigidbody2d = GetComponent<Rigidbody2D>();
    }
}  
  1. 添加发射子弹方法,传递一个二维向量(力的方向)和浮点数(力的大小)做为参数
public class Bullet : MonoBehaviour
{
    // 创建刚体对象
    private Rigidbody2D rigidbody2d;
    void Awake()
    {
        // 获取刚体组件
        rigidbody2d = GetComponent<Rigidbody2D>();
    }
    // 发射子弹方法
    public void launch(Vector2 direction, float force)
    {
        rigidbody2d.AddForce(direction * force);
    }
}  
  1. 添加子弹击中敌人的方法
    此时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);
    }
}  

五、编辑角色脚本

  1. 创建子弹预制体对象
public class Ruby : MonoBehaviour {
    // 创建子弹对象
    public GameObject bulletPrefab;
}  
  1. 新建发射子弹的方法
    创建子弹游戏对象,将子弹预制体实例化,创建子弹对象,获取子弹游戏物体的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");
    }
}  
  1. 当按下空格键时,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】动画混合树

  1. 打开Animator窗口,新建一个Shoot混合树(红色)
  2. 新建一个Trigger类型的参数Shoot(蓝色)
  3. 建立Move和Idle通向Shoot的连接,并添加条件为Shoot,建立Shoot通向Idle的连接,不添加任何条件(黄色)
  4. 新建四个Ruby射击的AnimationClip文件(上下左右),添加到Shoot混合树的四个Motion中(红色)
  5. 将混合类型修改为2D简单方向,将两个参数修改为LookX和LookY(蓝色)
  6. 修改四个Motion的两个参数(黄色)
  7. 在Ruby的Animator窗口中,将指向Shoot的的箭头取消退出时间,将过渡时间缩短为0

七、将bullet预制体挂载到Ruby创建的bulletPrefab对象

八、通过层级控制碰撞检测

  1. 点击Ruby游戏对象,进入层级控制设置,点击添加层
  2. 添加两个层级:player层、bullet层和background层
  3. 将Ruby的层级设置为player
  4. 将bullet的层级设置为bullet
  5. 将TileMap的层级设置为background
  6. 点击Edit,进入Project Settings面板
  7. 点击Physics选项,Layer Collision Matrix,取消bullet层和bullet层、player层、background层的碰撞

九、子弹的销毁

注:在以下代码中,只显示本标题新增功能的代码,省略原有的代码

  1. 添加Ruby游戏物体
public class Bullet : MonoBehaviour
{
    // 创建ruby游戏物体
    public GameObject ruby;
}  
![](https://wy-static.wenxiaobai.com/chat-rag-image/5894385458173643925)
  1. 获取Ruby游戏物体
![](https://wy-static.wenxiaobai.com/chat-rag-image/4045095605883360348)
  
![](https://wy-static.wenxiaobai.com/chat-rag-image/5198789564811175952)
public class Bullet : MonoBehaviour
![](https://wy-static.wenxiaobai.com/chat-rag-image/14712379444396919683)
{
    // 创建ruby游戏物体
![](https://wy-static.wenxiaobai.com/chat-rag-image/1806901325265095152)
    public GameObject ruby;
![](https://wy-static.wenxiaobai.com/chat-rag-image/6621246320505966208)
    void Awake()
![](https://wy-static.wenxiaobai.com/chat-rag-image/8576448723950646049)
    {
        // 获取Ruby游戏物体
![](https://wy-static.wenxiaobai.com/chat-rag-image/16384844549450940019)
        ruby = GameObject.Find("Ruby");
    }
}  
  1. 新增销毁子弹逻辑:若子弹离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);
        }
    }
}  

本章完。感谢阅读!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号