【Unity2D:C#Script】实现角色射击功能

devtools/2024/10/16 4:32:46/

一、创建子弹预制体

1. 创建子弹预制体

fca4140e8f54467fbc7d96df2f65af29.png

2. 调整图片大小、层级

86e6bed9ea0e4607a2341ba6a98b8b28.png

二、为子弹添加碰撞体积

1. 添加Box Collider 2D、Rigidbody 2D组件

b6918a7283064b72a7059295439a0a31.png

2. 锁定z轴

15ebf757c5ff4f1a87252ac767d9c9ac.png

三、编辑敌人脚本

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

1.  为敌人添加生命等基础属性

public class Enemy : MonoBehaviour
{// 定义敌人的最大生命值和当前生命值private int maxHealthPoint = 100;public int healthPoint;
}

2. 初始化:给当前生命值赋值

public class Enemy : MonoBehaviour
{// 定义敌人的最大生命值和当前生命值private int maxHealthPoint = 100;public int healthPoint;void Start(){// 为当前生命值赋值healthPoint = maxHealthPoint;}}

3. 为敌人添加改变生命值的方法

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>();}}

2. 添加发射子弹方法,传递一个二维向量(力的方向)和浮点数(力的大小)做为参数

public class Bullet : MonoBehaviour
{// 创建刚体对象private Rigidbody2D rigidbody2d;void Awake(){// 获取刚体组件rigidbody2d = GetComponent<Rigidbody2D>();}// 发射子弹方法public void launch(Vector2 direction, float force){rigidbody2d.AddForce(direction * force);}}

3. 添加子弹击中敌人的方法

        此时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;}

2. 新建发射子弹的方法

        创建子弹游戏对象,将子弹预制体实例化,创建子弹对象,获取子弹游戏物体的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");}}

3. 当按下空格键时,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的连接,不添加任何条件(黄色)

4cfbd12cad6e40c8884b8527c10325e9.png

4. 新建四个Ruby射击的AnimationClip文件(上下左右),添加到Shoot混合树的四个Motion中(红色)

5. 将混合类型修改为2D简单方向,将两个参数修改为LookX和LookY(蓝色)

6. 修改四个Motion的两个参数(黄色)

c16d55d3a94942de88f6fd64fdbb7caf.png

7. 在Ruby的Animator窗口中,将指向Shoot的的箭头取消退出时间,将过渡时间缩短为0

75ed5111842a4b48aa2ae52e3c82479a.png

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

a79939e705764e179cbdd5efe6713286.png

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

1. 点击Ruby游戏对象,进入层级控制设置,点击添加层

b0a2012ea3164fd9be70285861945759.png

2. 添加两个层级:player层、bullet层和background层

 5dc315ef31b74c13bf8364a407e6aa26.png

3. 将Ruby的层级设置为player

91f48d544edb438bb6ea3a2c9c7fbea7.png

4. 将bullet的层级设置为bullet

1bb8789e7eda4e86b2823529a491c5b6.png

5. 将TileMap的层级设置为background

e9e2afd34d8f41e2b0b85269b6abbabe.png

6. 点击Edit,进入Project Settings面板

8d8d174c71a24054b363cdb265536f8d.png

7. 点击Physics选项,Layer Collision Matrix,取消bullet层和bullet层、player层、background层的碰撞

65ef695d79204021aceb91f0f40c31f1.png

九、子弹的销毁

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

1. 添加Ruby游戏物体

public class Bullet : MonoBehaviour
{// 创建ruby游戏物体public GameObject ruby;
}

2. 获取Ruby游戏物体

public class Bullet : MonoBehaviour
{// 创建ruby游戏物体public GameObject ruby;void Awake(){// 获取Ruby游戏物体ruby = GameObject.Find("Ruby");}}

3. 新增销毁子弹逻辑:若子弹离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);}}}

        本章完。感谢阅读! 

 

 


http://www.ppmy.cn/devtools/42654.html

相关文章

民国漫画杂志《时代漫画》第18期.PDF

时代漫画18.PDF: https://url03.ctfile.com/f/1779803-1248612707-27e56b?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

VScode C/C++环境安装配置

1. 编译器需要从如下网站下载&#xff1a; MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net 2. 切换到file选项&#xff0c;下拉找到对应的文件版本直接下载&#xff1a; 3. 右键解压到当前文件夹如下&#xff1a; 4. 如图所示复制浏览器上的相应的…

【全开源】优校管理系统(支持微信小程序+H5+app)

优校管理系统(简称优校管)是一款基于FastAdmin和ThinkPHP进行开发的中小学信息化管理系统&#xff0c;拥有PC版、UniAPP版(高级授权)。支持微信小程序、H5网页等多平台&#xff0c;主要用于信息管理、教学管理、素养评价。 引领智慧校园新风尚 随着信息技术的快速发展&#x…

若依前端vue实现 输入框下拉选择加搜索用户

探索代码以及详细的注解 <template><div><el-select v-model"selectedUserId" filterable placeholder"选择用户" change"handleChange"><el-optionv-for"user in filteredUsers":key"user.userId":l…

C 语言设计模式(结构型)

文章目录 代理模式场景示例 门面模式场景示例 桥接模式场景示例 适配器模式场景示例 外观模式场景示例 享元模式场景示例 装饰器模式场景示例 组合模式场景示例 代理模式 C语言中&#xff0c;代理模式通常用于实现对象的间接访问。代理模式是一种结构型设计模式&#xff0c;它…

深度学习——图像分类(CNN)—训练模型

训练模型 1.导入必要的库2.定义超参数3.读取训练和测试标签CSV文件4.确保标签是字符串类型5.显示两个数据框的前几行以了解它们的结构6.定义图像处理参数7.创建图像数据生成器8.设置目录路径9.创建训练和验证数据生成器10.构建模型11.编译模型12.训练模型并收集历史13.绘制损失…

Linux 内核开发 25 - 中的 cpuidle subsystem 介绍

Linux 内核中的 cpuidle subsystem 是负责管理 CPU 的空闲状态的子系统。 它的工作原理如下: 1. 空闲状态检测: - cpuidle 子系统会持续监控 CPU 的使用情况,一旦检测到 CPU 处于空闲状态,就会尝试进入低功耗模式。 2. 空闲状态选择: - cpuidle 子系统会根据当前 CPU 的…

【示例】MySQL-4类SQL语言-DQL

文章目录 前言DQL | Data Query Language总述 | 涵盖几乎所有关键字的DQL语句单表查询关键字 | 用在Select后面查询内容&#xff1a;表字段查询内容&#xff1a;聚合函数查询内容&#xff1a;[排序函数] [聚合函数] 窗口函数查询内容&#xff1a;表字段函数 关键字 | 用在Where…