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

一、创建子弹预制体

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.mzph.cn/pingmian/14305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣刷题---返回word中所有不重复的单词

当需要从一个数据集合中去除重复元素时&#xff0c;set是一个很好的选择。由于其不允许存储重复的元素&#xff0c;因此可以很容易地实现去重功能。这在处理原始数据或进行数据分析时特别有用。 题目&#xff1a; 给定一个字符串数组 words&#xff0c;请返回一个由 words 中所…

chrome125.0.6422.60驱动包下载

百度网盘地址:https://pan.baidu.com/s/1DAr_O58GQ6m4sk_QePZscA?pwd=5t0j 提取码:5t0j Chrome驱动包(ChromeDriver)是一个用于支持自动化测试的工具,它提供了对Google Chrome浏览器的控制,使您可以编写和运行自动化脚本来测试网站。这个驱动程序是由Selenium项目开…

国内大模型价格战全面爆发:新旧势力逐鹿江湖【附主流模型价格对比】

近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;大模型逐渐成为行业的焦点。然而&#xff0c;伴随而来的却是一场价格战。DeepSeek率先推出超低价服务&#xff0c;随后字节跳动、阿里巴巴、百度、科大讯飞、腾讯等巨头纷纷跟进&#xff0c;使得这一领域的竞争愈演愈…

详细分析ping的基本知识以及常见网络故障的诊断(图文解析)

目录 前言1. 基本知识2. 常见故障分析2.1 请求超时2.2 域名无法解析 前言 由于全栈开发&#xff0c;在运维过程中难免会出现无法ping通等故障 针对多种情况进行详细分析 1. 基本知识 为了更好的加深ping的基本命令以及拓展更多知识点&#xff0c;详细科普其基本知识 ping&…

python写页面自动截图

from selenium import webdriver def take_screenshot(url, file_path):driver webdriver.Chrome()driver.get(url)driver.save_screenshot(file_path)driver.quit() if __name__ __main__:take_screenshot(http://baidu.com, D:\桌面\wang.png)要安装selenium还要安装google…

C语言 数组——查找算法的函数实现

目录 线性查找&#xff08;Linear Search&#xff09; 线性查找的性能 猜数游戏 二分查找&#xff08;Binary Search&#xff09; 并非吹毛求疵&#xff0c;鸡蛋里挑骨头 二分查找的性能 线性查找&#xff08;Linear Search&#xff09; 不 要求数据表是已排好序的  …

arcgisPro精确移动要素某一点至指定点位

1、打开要素&#xff0c;如下&#xff1a; 2、选择移动工具&#xff0c;如下&#xff1a; 3、选择需要移动的要素&#xff0c;如下&#xff1a; 4、按住Ctrl键&#xff0c;移动锚点的位置至三角形顶点位置&#xff0c;如下&#xff1a; 5、拖动锚点至上面多边形的左上角点&…

李斌阻击马斯克,也不放过李想

市场唯一不变的就是变化。 当年特斯拉开放专利&#xff0c;引起了国内电动车的创业潮&#xff0c;蔚来比小鹏、理想早几个月成立&#xff0c;也是造车新势力中首家实现交付的品牌。 但时过境迁&#xff0c;现在已经不是蔚来领衔“蔚小理”的时代了&#xff0c;理想是其中销量…

加密与解密(第四版)】第二十五章笔记

第二十五章 数据取证技术 25.1 硬盘数据的获取和固定 取证专用的Linux可启动光盘 硬盘复制机 利用取证计算机复制硬盘 手机&#xff08;JTAG&#xff09; 电子数据的固定&#xff08;HASH值&#xff09; 25.2 硬盘的分区和数据恢复 25.3 内存分析 25.4 动态仿真技术 25.…

2024电工杯B题:大学生平衡膳食食谱的优化设计及评价

大学时代是学知识长身体的重要阶段&#xff0c;同时也是良好饮食习惯形成的重要时期。这一特 定年龄段的年轻人&#xff0c;不仅身体发育需要有充足的能量和各种营养素&#xff0c;而且繁重的脑力劳动和 较大量的体育锻炼也需要消耗大量的能源物质。大学生中饮食结构不合理以及…

弱电工程企业项目一体化管理系统解决方案!企智汇项目管理系统

企智汇工程项目管理系统是一款为弱电工程企业量身打造的专业解决方案&#xff0c;旨在帮助企业实现项目管理的数智化、全流程化和一体化。以下是该系统的详细介绍&#xff1a; 1. 功能丰富&#xff1a;企智汇工程项目管理系统支持全周期的项目管理&#xff0c;包括客户管理、招…

LVGL显示中文字体及其它语言文字详细笔记教程

在前面几篇博客文章中&#xff0c;已经对LVGL的移植和使用进行了较为详细的介绍&#xff0c;在本文中将讲解如何在LVGL的控件中显示中文字体及其它语言字体。 LVGL在VScode中安装模拟器运行配置笔记教程_vscode lvgl-CSDN博客 LVGL移植到STM32 MCU平台详细经验笔记教程-CSDN博…

vue koa post 请求代理失败问题总结

场景是在使用 koa 写接口时&#xff0c;客户端发送 post 请求&#xff0c;服务端会报下面这个错误&#xff0c;导致接口未能访问成功&#xff1a; 前端接口一直 Pending 状态&#xff0c; 解决方案&#xff1a;走的是本地 mock 数据&#xff0c;未访问服务端的接口 总结&#x…

[JAVASE] 类和对象(五) -- 抽象类和接口

目录 一. 抽象类 1.1 抽象类的定义 1.2 抽象类的实现 1.3 抽象类的作用 1.4 抽象类注意事项 二. 接口 2.1 接口的定义 2.2 接口的实现 2.3 接口的作用 2.4 接口注意事项 三. 总结 一. 抽象类 1.1 抽象类的定义 如果一个类中没有包含足够的信息来描绘一个具体的对象, 那么…

远程PLC、工控设备异地调试,贝锐蒲公英异地组网方案简单高效

北京宇东宁科技有限公司专门提供非标机电设备&#xff0c;能够用于金属制品的加工制造。设备主要采用西门子的PLC作为控制系统&#xff0c;同时能够连接上位机用于产量、温度、压力、电机运行数据的监控&#xff0c;以及工厂的大屏呈现需求。目前&#xff0c;客户主要是市场上的…

百度陈之若:第一批大模型伙伴已经实现财富自由了

大模型继续在 2024 年的春天里疾驰而进。 2024 年 4 月 9 日&#xff0c;百度智能云在成都举行的首届 GENERATE 全球生态大会上&#xff0c;公布了过去一年大模型生态建设的最新“成绩单” 。 目前&#xff0c;已经有超过 8.5 万客户在使用千帆大模型平台&#xff0c;开发了超…

EI稳定检索--人文社科类会议(ICBAR 2024)

【ACM独立出版】第四届大数据、人工智能与风险管理国际学术会议 (ICBAR 2024) 2024 4th International Conference on Big Data, Artificial Intelligence and Risk Management 【高录用•快检索&#xff0c;ACM独立出版-稳定快速EI检索 | 往届均已完成EI, Scopus检索】 【见…

SAPUI5基础知识2 - 手动创建一个SAPUI5的项目

1. 前言 在本篇文章中&#xff0c;我们将手动一步一步建立出第一个SAPUI5的 ‘Hello World!’ 项目。 2. 步骤详解 2.1 在BAS中建立Dev Space 进入SAP Business Application Studio的Dev Space Manger&#xff0c;选择创建Dev Space。 勾选HTML5 Application Template插件…

OpenWrt改网桥模式(AP模式)

OpenWrt改网桥模式&#xff08;AP模式&#xff09; 点击“接口” 删掉所有 wan 接口 点击“设备”&#xff0c;配置“br-lan" 点击网桥接口&#xff0c;勾选所有接口 点击保存 添加新接口&#xff08;不添加的话路由器自身系统没网&#xff09; 返回 “网络” - “接…

k8s部署presto

&#xff08;作者&#xff1a;陈玓玏&#xff09; 一、前提条件 已部署k8s&#xff1b;已部署hadoop和hive&#xff0c;可参考以下链接&#xff1a; https://blog.csdn.net/weixin_39750084/article/details/136750613?spm1001.2014.3001.5502 https://blog.csdn.net/wei…