【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.rhkb.cn/news/329724.html

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

相关文章

一阶数字高通滤波器

本文的主要内容包含一阶高通滤波器公式的推导和数字算法的实现以及编程和仿真 1 计算公式推导 1.1.2 算法实现及仿真 利用python实现的代码如下&#xff1a; import numpy as np # from scipy.signal import butter, lfilter, freqz import matplotlib.pyplot as plt #2pifW…

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端) Java毕业设计…

视频监控管理平台LntonCVS监控视频汇聚融合云平台主要功能应用场景介绍

随着网络技术的不断发展和万物互联时代的到来&#xff0c;视频融合在一些系统集成项目及综合管理应用中变得日益重要。本文以LntonCVS视频融合云平台为案例&#xff0c;探讨视频融合的对象及其应用场景。 1. 视频监控设备 视频监控摄像设备是各种视频应用项目的基础部分。在视…

亚马逊卖家账号注册复杂吗?需要什么辅助工具吗?

在当今数字化的商业世界中&#xff0c;亚马逊作为全球最大的电商平台之一&#xff0c;吸引着无数的卖家和买家。对于想要进入亚马逊销售市场的卖家来说&#xff0c;首先要完成的一项重要任务就是注册亚马逊卖家账号。本文将详细介绍亚马逊注册的步骤、所需时间&#xff0c;以及…

入门四认识HTML

一、HTML介绍 1、Web前端三大核心技术 HTML&#xff1a;负责网页的架构 CSS&#xff1a;负责网页的样式、美化 JS&#xff1a;负责网页的行动 2、什么是HTML HTML是用来描述网页的一种语言。 3、Html标签 单标签<html> 双标签<h>内容</h> 4、标…

【译】组复制和 Percona XtraDB 集群: 常见操作概述

原文地址&#xff1a;Group Replication and Percona XtraDB Cluster: Overview of Common Operations 在这篇博文中&#xff0c;我将概述使用 MySQL Group Replication 8.0.19&#xff08;又称 GR&#xff09;和 Percona XtraDB Cluster 8 (PXC)&#xff08;基于 Galera&…

服务器数据恢复—EVA存储多块硬盘离线导致部分LUN丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 1台某品牌EVA4400控制器3台EVA4400扩展柜28块FC硬盘。 服务器故障&#xff1a; 由于两块磁盘掉线导致存储中某些LUN不可用&#xff0c;某些LUN丢失&#xff0c;导致存储崩溃。 服务器数据恢复过程&#xff1a; 1、由于EVA4400存储故障是某些磁…

Java 对外API接口开发 java开发api接口如何编写

Java API API&#xff08;Application Programming Interface&#xff09;是指应用程序编程接口&#xff0c;的JavaAPI是指JDK提供的各种功能的Java类 String类 String类的初始化&#xff1a; &#xff08;1&#xff09;使用字符串常量直接初始化 初始化&#xff1a;String s…

闲话 .NET(4):为什么要跨平台?

前言 .NET Core 有一个关键词就是跨平台&#xff0c;为什么要跨平台呢&#xff1f;Windows 操作系统不香吗&#xff1f;今天我们来聊聊这个 原因一&#xff1a;安全考虑 Windows OS 是闭源的&#xff0c;而 Linux 是开源的&#xff0c;因此有些公司的技术负责人就认为 Linux…

笔记:weblogic配置内存启动参数

可以在控制台配置 参数值 -Xms2048m -Xmx2048m -XX:PermSize512m -XX:MaxPermSize512m -Xss128k激活更改。修改完之后&#xff0c;节点需要重启才能生效。 参数说明&#xff1a; -Xms 为JVM启动时分配的内存 -Xmx 为JVM运行过程中分配的最大内存 -XX:PermSize 为JVM初始分配…

Qt笔记:动态处理多个按钮点击事件以更新UI

问题描述 在开发Qt应用程序时&#xff0c;经常需要处理多个按钮的点击事件&#xff0c;并根据点击的按钮来更新用户界面&#xff08;UI&#xff09;&#xff0c;如下图。例如&#xff0c;你可能有一个包含多个按钮的界面&#xff0c;每个按钮都与一个文本框和一个复选框相关联…

python从0开始学习(十二)

目录 前言 1、字符串的常用操作 2、字符串的格式化 2.1 格式化字符串的详细格式&#xff08;针对format形式&#xff09; ​编辑 总结 前言 上一篇文章我们讲解了两道关于组合数据类型的题目&#xff0c;本篇文章我们将学习新的章节&#xff0c;学习字符串及正则表达式。 …

react实现把pc网站快捷添加到桌面快捷方式

文章目录 1. 需求2. 实现效果3. 核心逻辑4. 完整react代码 1. 需求 这种需求其实在国外一些游戏网站和推广网站中经常会用到&#xff0c;目的是为了让客户 快捷方便的保存网站到桌面 &#xff0c;网站主动尽量避免下次找不到网站地址了&#xff0c;当然精确的客户自己也可以使…

打印安全:防止打印过程中的商业机密泄露

在数字化办公日益普及的今天&#xff0c;打印安全常常成为企业信息保护中被忽视的一环。商业机密在打印过程中泄露&#xff0c;可能会给企业带来巨大的损失。本文将探讨如何通过一系列措施&#xff0c;确保打印过程中的商业机密安全。 一、打印安全的重要性 打印设备作为企业中…

hbase版本从1.2升级到2.1 spark读取hive数据写入hbase 批量写入类不存在问题

在hbase1.2版本中&#xff0c;pom.xml中引入hbase-server1.2…0和hbase-client1.2.0就已经可以有如下图的类。但是在hbase2.1.0版本中增加这两个不行。hbase-server2.1.0中没有mapred包&#xff0c;同时mapreduce下就2个类。版本已经不支持。 <dependency><groupId>…

两步将 CentOS 6.0 原地升级并迁移至 RHEL 7.9

《OpenShift / RHEL / DevSecOps 汇总目录》 说明 本文介绍如何将一个 CentOS 6.0 的系统升级并转换迁移到 RHEL 7.9。 本文是《在离线环境中将 CentOS 7.X 原地升级并迁移至 RHEL 7.9》阶进篇。 所有被测软件的验证操作可参见上述前文中对应章节的说明。 准备 CentOS 6.…

数据量较小的表是否有必要添加索引问题分析

目录 前言一、分析前准备1.1、准备测试表和数据1.2、插入测试数据1.3、测试环境说明 二、具体业务分析2.1、单次查询耗时分析2.2、无索引并发查询服务器CPU占用率分析2.3、添加索引并发查询服务器CPU占用率分析 三、总结 前言 在一次节日活动我们系统访问量到达了平时的两倍&am…

SAP PRD覆盖QAS 替代方案构想

随着时间的推移&#xff0c;SAP PRD的数据跟QAS的差异会越来越大&#xff0c;一般是定期PRD覆盖QAS。但是在没有BASIS的情况下&#xff0c;没有这块经验的情况下&#xff0c;也没有外部支持的情况下&#xff0c;贸然做这个事情也是有风险的&#xff0c;有没有替代方案&#xff…

算法2:滑动窗口(上)

文章目录 长度最小子数组无重复字符的最长子串[最大连续 1 的个数III](https://leetcode.cn/problems/max-consecutive-ones-iii/description/)将x减到0的最小操作数 长度最小子数组 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {in…

vue3中基于element-plus封装一个表格弹框组件,要求可以单选和多选table数据

单选&#xff1a; <template><SelectMaterialref"selectMaterialRef"check"checkbox"select"selectMaterial"></SelectMaterial><el-button type"primary" size"small" icon"el-icon-plus"…