【unity实战】实现蓄力丢手榴弹、烟雾弹、燃烧弹的效果

文章目录

  • 爆炸燃烧烟雾效果资产
  • 手榴弹
  • 丢手雷
  • 烟雾弹、燃烧弹
  • 实现手雷每次撞墙弹发出音效(补充)
  • 完结

爆炸燃烧烟雾效果资产

https://assetstore.unity.com/packages/vfx/particles/war-fx-5669
在这里插入图片描述

手榴弹

手榴弹配置好刚体,碰撞体
在这里插入图片描述
新增脚本Throwable,控制手榴弹爆炸

using UnityEngine;public class Throwable : MonoBehaviour
{// 可序列化字段,用于在编辑器中设置[SerializeField] float delay = 3f;[SerializeField] float damageRadius = 20f;[SerializeField] float explosionForce = 1200f;float countdown; // 倒计时bool hasExploded = false;public bool hasBeenThrown = false;// 抛出物类型枚举public enum ThrowableType{Grenade}public ThrowableType throwableType;private void Start(){countdown = delay; // 初始化倒计时}private void Update(){if (hasBeenThrown){countdown -= Time.deltaTime; // 倒计时减少}if (countdown <= 0f && !hasExploded) // 如果倒计时结束并且还没有爆炸{Explode(); // 爆炸hasExploded = true;}}private void Explode(){GetThrowableEffect(); // 获取抛出物效果//TODO:播放音效Destroy(gameObject); // 销毁抛出物对象}private void GetThrowableEffect(){switch (throwableType){case ThrowableType.Grenade: // 如果是手榴弹GrenadeEffect(); // 手榴弹效果break;}}private void GrenadeEffect(){// 获取手榴弹爆炸效果的预制体对象GameObject explosionEffect = GlobalReferences.Instance.grenadeExplosionEffect;// 在手榴弹位置实例化爆炸效果预制体对象Instantiate(explosionEffect, transform.position, transform.rotation);// 在伤害半径内获取所有的碰撞体对象Collider[] colliders = Physics.OverlapSphere(transform.position, damageRadius);// 遍历所有在伤害半径内的碰撞体对象foreach (Collider objectInRange in colliders){Rigidbody rb = objectInRange.GetComponent<Rigidbody>();if (rb != null){// 将力的爆炸效果应用于碰撞体对象rb.AddExplosionForce(explosionForce, transform.position, damageRadius);}// 还可以在此处对敌人应用伤害}}
}

丢手雷

这里按住G时,力气会越来越大,最大到2倍力,松开G丢出炸弹

using UnityEngine;public class PlayerThrowables : MonoBehaviour
{[Header("Throwables")]public int grenades = 0; // 玩家拥有的手榴弹数目public float throwForce = 10f; // 抛出物的初始速度public GameObject grenadePrefab; // 手榴弹的预制体对象public GameObject throwableSpawn; // 抛出物的发射点public float forceMultiplier = 0; // 用于计算抛出物的力度的倍数public float forceMultiplierLimit; // 抛出物的力度倍数的最大值private void Update(){// 如果按下了 G 键,增加抛出物的力度if (Input.GetKey(KeyCode.G)){forceMultiplier += Time.deltaTime;}// 如果抛出物的力度超过了最大值,将其设置为最大值if (forceMultiplier > forceMultiplierLimit){forceMultiplier = forceMultiplierLimit;}// 如果松开了 G 键,抛出抛出物if (Input.GetKeyUp(KeyCode.G)){if (grenades > 0) // 如果玩家拥有手榴弹{ThrowLethal(); // 抛出手榴弹forceMultiplier = 0; // 重置抛出物的力度}}}private void ThrowLethal(){// 获取手榴弹的预制体对象GameObject lethalPrefab = grenadePrefab;// 在抛出物的发射点实例化手榴弹对象GameObject throwable = Instantiate(lethalPrefab, throwableSpawn.transform.position, Camera.main.transform.rotation);// 获取手榴弹对象的刚体组件Rigidbody rb = throwable.GetComponent<Rigidbody>();// 计算手榴弹受到的力的大小并应用到其上rb.AddForce(Camera.main.transform.forward * (throwForce * forceMultiplier), ForceMode.Impulse);// 将已经抛出的标志设置为 truethrowable.GetComponent<Throwable>().hasBeenThrown = true;// 减少玩家拥有的手榴弹数目grenades--;// 更新 HUD 显示HUDManager.Instance.UpdateThrowables(Throwable.ThrowableType.Grenade);}
}

烟雾弹、燃烧弹

烟雾弹、燃烧弹实现和手榴弹差不多,加个类型,换个特效、声音即可

实现手雷每次撞墙弹发出音效(补充)

要实现手雷在撞击墙壁时播放音效,可以按照以下步骤进行操作:

  1. 获取碰撞事件:在手雷的脚本中,使用 OnCollisionEnter 或 OnTriggerEnter 函数来检测与墙壁的碰撞。当手雷与墙壁碰撞时,这些函数将被调用。

  2. 添加音效组件:在手雷的游戏对象上,添加一个 AudioSource 组件。这个组件将用于播放音效。

  3. 导入音效文件:将你希望用于手雷撞击墙壁音效的音频文件导入到 Unity 项目中。确保音频文件的格式与 Unity 支持的格式相匹配(如 .wav、.mp3 等)。

  4. 设置音效属性:在 AudioSource 组件中,将导入的音频文件分配给 AudioClip 属性。

  5. 播放音效:在 OnCollisionEnter 或 OnTriggerEnter 函数中,使用 GetComponent().Play() 来触发音效的播放。

下面是一个示例代码片段,演示了如何在手雷撞击墙壁时播放音效:

using UnityEngine;public class Grenade : MonoBehaviour
{public AudioClip explosionSound; // 音效文件private AudioSource audioSource;private void Start(){audioSource = GetComponent<AudioSource>();audioSource.clip = explosionSound;}private void OnCollisionEnter(Collision collision){if (collision.gameObject.CompareTag("Wall")){audioSource.Play(); // 播放音效// 其他处理逻辑...}}
}

在这个示例中,手雷游戏对象上需要有一个带有 AudioSource 和 Grenade 脚本的组件。explosionSound 变量需要在 Inspector 窗口中分配手雷撞击墙壁时播放的音效文件。

这样,在手雷与墙壁碰撞时,音效将被触发并播放。请确保手雷和墙壁都有合适的碰撞体组件,并且已打上正确的标签(如 “Wall”)。根据实际情况,你可能需要调整代码和音效文件路径来适应你的项目设置。

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/649395.shtml

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

相关文章

IO流-处理流之——对象流(序列化)

IO流-处理流之——对象流&#xff08;序列化&#xff09; 1.数据流及其作用&#xff08;了解&#xff09;2.对象流及其作用3.对象的序列化机制是什么4.如下两个过程使用的流&#xff1a;5.自定义类要想实现序列化机制&#xff0c;需满足&#xff1a;6.注意点&#xff1a; 1.数据…

Qlik Sense : Store With Retry (保存重试机制)

Background sometime you cannot store the file directly ,maybe there are another process are reading/storeing the file , so you would need to wait another proecess done and retry . then we come up this solution . 有时您不能直接存储文件&#xff0c;可能还有…

Jenkins CLI 任意文件读取漏洞复现(CVE-2024-23897)

0x01 产品简介 Jenkins 是一个开源的自动化服务器软件,用于构建、测试和部署软件项目。它提供了一种强大的方式来自动化软件开发和交付流程,以提高开发团队的效率和生产力。 0x02 漏洞概述 漏洞成因 命令行接口文件读取: Jenkins内置的命令行接口(CLI)存在一个特性,允…

实验:eNSP AR通过telnet远程登录另外一台AR

实验2&#xff1a;eNSP AR通过telnet远程登录另外一台AR 基于实验1的基础上来进行&#xff0c;我们通过AR2220登录AR3260 首先设置远程登录密码 1、user-interface vty 0 4 进入用户的虚拟终端 2、设置密码 set authentication password cipher Huawei 这里的意思就是设置密…

org.springframework.util.StringUtils 下StringUtils工具类

目录 1.isEmpty 1.1.可以判断字符串是否为空或 null 1.2.可以判断Integer类型的数据是否为空 1.isEmpty 1.1.可以判断字符串是否为空或 null Testpublic void test() {/*** StringUtils.isEmpty 判断是空*/String username "123456";System.out.println(Strin…

数据结构(C语言版)代码实现(四)——静态单链表的部分代码实现

目录 参考材料、格式 头文件SLinkList.h 库、宏定义、函数类型声明 线性表的静态单链表存储结构 按值查找 初始化静态链表 分配空间 回收空间 打印已用链表中的元素 求集合(A-B)U(B-A)中的元素&#xff08;重点介绍&#xff09; 调试过程 修改报错与警告 调试 完整…

找不到msvcp110.dll怎么办,msvcp110.dll丢失修复方法分享

当计算机系统中无法找到msvcp110.dll这个特定的动态链接库文件时&#xff0c;可能会引发一系列运行问题和功能受限的情况。msvcp110.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows的应用程序来说&#xff0c;它是至关重要的运行组件…

vue模拟聊天页面列表:滚动到底部,滚动到顶部触发加载更多

先看下效果&#xff1a; 代码&#xff1a; <template><div><div style"text-align: center"><button click"scrollTop">滚动到顶部</button><button click"scrollBottom">滚动到底部</button></d…

Vue深入学习2—虚拟DOM和Diff算法

1、snabbdom 是什么&#xff1f; snabbdom是“速度"的意思&#xff0c;源码只有200行&#xff0c;使用TS写的&#xff0c;让东西变得模块化 2、snabbdom 的 h 函数如何工作&#xff1f; h函数用于产生虚拟节点&#xff0c;同时也可以嵌套使用&#xff0c;得到虚拟DOM树&am…

kuberneters可视化界面-kuboard

一、kuboard安装 可以选用&#xff0c;docker和docker-commpose kuberneters 安装 kuboard官网 1、 docker安装 sudo docker run -d \--restartunless-stopped \--namekuboard \-p 80:80/tcp \-p 10081:10081/tcp \-e KUBOARD_ENDPOINT"http://192.168.1.10:80" …

linux的kali安装,换源,更新包

下载kali kali.org进入官网后点第二个 然后点第一个 解压kali 下载后获得.7z压缩包&#xff0c;建议移动到合适自己电脑的位置进行解压&#xff0c;我喜欢放在D盘 启动kali 双击进入解压出的文件夹&#xff0c;将唯一一个.vmx文件用vmware打开&#xff08;没装的自行提前装…

数据结构奇妙旅程之二叉树题型解法总结

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

【数据库】oracle常见语句

一、查询 查询员工表所有数据 select * from emp查询职位(JOB)为’PRESIDENT’的员工的工资 select sal from emp where jobPRESIDENT查询佣金(COMM)为0或为NULL的员工信息 select * from emp where comm0 or comm is null查询入职日期在 1981-5-1到1981-12-31之间的所有员…

滑动窗口(算法)

一、算法分享&#xff1a;滑动窗口 原题描述&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 思路 定义一个 map 数据结构存储 (k, v)&#xff0c;其中 key 值为字符&#xff0c;value 值为字符位置 1&#xff0c;加 1 …

【深度学习】CodeFormer训练过程,如何训练人脸修复模型CodeFormer

文章目录 BasicSR介绍环境数据阶段 I - VQGAN阶段 II - CodeFormer (w0)阶段 III - CodeFormer (w1) 代码地址&#xff1a;https://github.com/sczhou/CodeFormer/releases/tag/v0.1.0 论文的一些简略介绍&#xff1a; https://qq742971636.blog.csdn.net/article/details/134…

链路追踪-调用链跟踪-Jaeger

文章目录 一、什么是链路跟踪二、OpenCensusOpenCensus 主要特点OpenTracing标准基本概念Span 三、典型服务端产品什么是OpenTracing?opentracing 使用介绍 四、JaegerJaeger 包含的模块Jaeger-client&#xff08;客户端库&#xff09; 五、Jaeger服务容器化部署过程问题整理 …

csdn黑色背景用法

在edge浏览器下&#xff0c;下载油猴脚本管理器 脚本下载 edge扩展 效果图如下&#xff1a;&#xff1a;&#xff1a;

[ACM学习] 进制转换

进制的本质 本质是每一位的数位上的数字乘上这一位的权重 将任意进制转换为十进制 原来还很疑惑为什么从高位开始&#xff0c;原来从高位开始的&#xff0c;可以被滚动地乘很多遍。 将十进制转换为任意进制

适合深夜发朋友圈的心灵鸡汤(整理70句)

1、很多时候&#xff0c;我们赢得了口舌&#xff0c;却失去了感情。 2、失恋到极致的时候&#xff0c;我真的会用后退来保护自己。 3、全身心地去爱&#xff0c;你可能会受到伤害&#xff0c;但这是完整人生的唯一方式。 4、自由不是想干什么就干什么&#xff0c;而是不想干…

Linux中LVM实验

LVM实验&#xff1a; 1、分区 -L是大小的意思-n名称的意思 从vg0&#xff08;卷组&#xff09;分出来 2、格式化LV逻辑卷 LVM扩容 如果icdir空间不够了&#xff0c; 扩展空间lvextend -L 5G /dev/vg0/lv1 /dev/vg0/lv1(pp,vg,lv) 刷新文件系统xfs_growfs /lvdir VG扩容 …