【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);

        // 将已经抛出的标志设置为 true
        throwable.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是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dify学习笔记-工具(七)

1、工具 工具定义 工具可以扩展 LLM 的能力&#xff0c;比如联网搜索、科学计算或绘制图片&#xff0c;赋予并增强了 LLM 连接外部世界的能力。Dify 提供了两种工具类型&#xff1a;第一方工具和自定义工具。 你可以直接使用 Dify 生态提供的第一方内置工具&#xff0c;或者轻…

Likeshop多商户商城源码系统,支持二开

在电商行业高速发展的当下&#xff0c;拥有一套功能强大、易于操作的开源商城系统至关重要。Likeshop多商户商城系统正是这样一款集H5、小程序、独立APP于一体的开源电商解决方案&#xff0c;助力商家实现智能营销。 一、产品简介 Likeshop多商户商城系统为商家提供了丰富的营…

广州市荔湾区区长谭明鹤、广州工控副总经理张劲泉一行莅临上海毅速考察交流

2024年1月23日&#xff0c;广州市荔湾区区长谭明鹤、副区长阮伟致、广州工业投资控股集团有限公司&#xff08;简称&#xff1a;广州工控&#xff09;副总经理张劲泉等一行来到毅速公司上海总部考察交流。毅速公司董事长张占波、总经理陈烨、常务副总经理王利军等亲切接待了考察…

Sublime Text 3配置 Java 开发环境

《开发工具系列》 《开发语言-Java》 Sublime Text 3配置 Java 开发环境 一、引言二、主要内容1. 初识 Sublime Text 32. 初识 Java3. 接入 Java3.1 JDK 下载3.2 安装和使用 java3.3 环境变量配置 4. 配置 Java 开发环境5. 编写 Java 代码6. 编译和运行 Java 代码7. 乱码问题 三…

智能体AI Agent的极速入门:从ReAct到AutoGPT、QwenAgent、XAgent

前言 如这两天在微博上所说&#xff0c;除了已经在七月官网上线的AIGC模特生成系统外&#xff0c;我正在并行带多个项目组 第二项目组&#xff0c;论文审稿GPT第2版的效果已经超过了GPT4&#xff0c;详见《七月论文审稿GPT第2版&#xff1a;用一万多条paper-review数据集微调…

Confluence 的文章导入到 YouTrack KB 中

YouTrack 是有一个 KB 的&#xff0c;我们可以吧 Confluence 的文章全部导入到 YouTrack 的 KB 中。 首先&#xff0c;你需要具有管理员权限&#xff0c;然后选择导入。 然后可以在打开的界面中新增一个导入。 在新增导入中输入 Confluence 在随后的界面中输入你 Confluence …

OpenCV书签 #差值哈希算法的原理与相似图片搜索实验

1. 介绍 差值哈希算法&#xff08;Difference Hash Algorithm&#xff0c;简称dHash&#xff09; 是哈希算法的一种&#xff0c;主要可以用来做以图搜索/相似图片的搜索工作。 2. 原理 差值哈希算法通过计算相邻像素的差异来生成哈希&#xff0c;即通过缩小图像的每个像素与平…

关于IDEA中sout、fori无法自动生成的解决方案

方案一.通过idea中的设置修改 搜索栏搜索sout 点击change&#xff0c;全部勾选Java下的选项 最后别忘了点击右下角的Apply 方案二&#xff1a;写main函数 不能直接在类里生成&#xff0c;需要写一个main函数。&#xff08;我就是忘了写main函数才无法生成的。&#xff09…

Soul CEO张璐积极履行反诈责任,倡导共建安全网络

近期,备受期待的反诈电影《鹦鹉杀》热映,深入剖析杀猪盘这一网络诈骗行为。为协助更多人增强反诈意识,备受欢迎的社交应用Soul App积极响应,在Soul CEO张璐的带领下,邀请电影中的演员和平台的反诈中心共同参与反诈宣传。此外,一旦用户在平台搜索“诈骗”、“杀猪盘”、“鹦鹉杀…

Spring Boot3整合MyBatis Plus

目录 1.前置条件 2.导坐标 3.配置数据源 4.mybatis-plus基础配置 5.配置mapper扫描路径 6.MyBatis Plus代码生成器整合 1.导坐标 2.编写代码生成逻辑 7.整合Druid连接池 1.前置条件 已经初始化好一个spring boot项目且版本为3X&#xff0c;项目可正常启动 初始化教程…

Halcon指定区域的形状匹配

Halcon指定区域的形状匹配 文章目录 Halcon指定区域的形状匹配1.在参考图像中选择目标2.创建模板3.搜索目标 在这个实例中&#xff0c;会介绍如何根据选定的ROI选择合适的图像金字塔参数&#xff0c;创建包含这个区域的形状模板&#xff0c;并进行精确的基于形状模板的匹配。最…

echarts-wordcloud词云

echarts-wordcloud是基于echarts的一个插件&#xff0c;所以我们要首先安装echarts包&#xff0c;然后再安装echarts-wordcloud的包&#xff0c;这里我的练习项目安装的版本&#xff1b;当然&#xff0c;你可以随意安装你需要的版本&#xff1b; “echarts”: “^5.3.3”, “ec…

PCB制板基础知识

一、PCB概念 PCB&#xff08;PrintedCircuitBoard&#xff09;&#xff0c;中文名称为印制电路板&#xff0c;又称印刷电路板、印刷线路板&#xff0c;是重要的电子部件&#xff0c;是电子元器件的支撑体&#xff0c;是电子元器件电气连接的提供者。由于它是采用电子印刷术制作…

前端工程化基础(一):Node模块化

Node模块化 Node.js是什么 官方定义&#xff1a;Node.js是一个基于V8 JavaScript引擎的JavaScript运行时的环境 Node.js基于V8引擎来执行 JavaScript代码&#xff0c;但是Node.js中不仅仅有V8 我们知道&#xff0c;V8可以嵌入到C应用程序中&#xff0c;因此无论是Chrome还是No…

Redis快的秘密,高性能设计epoll和IO多路复用探究

Redis快的原因&#xff0c;高性能设计epoll和IO多路复用探究 1、多路复用需要解决的问题 并发多客户端连接&#xff0c;在多路复用之前最简单和典型的方案&#xff1a;同步阻塞网络IO模型 这种模式的特点就是用一个进程来处理一个网络连接&#xff08;即一个用户请求&#x…

windows 下docker-compose 试玩 paperlsess

第一步安装&#xff1a;&#xff08;假设docker-compose已安装好&#xff09; 下载 docker-compose.yml &#xff0c;docker-compose.env: github下载地址 在docker-paperless.env增加环境变量,设置管理员账户信息&#xff1a; PAPERLESS_ADMIN_USER: admin PAPERLESS_ADMIN_P…

分页查询的使用

背景 在业务中我们在前端总是需要展示数据&#xff0c;将后端得到的数据进行分页处理&#xff0c;通过pagehelper实现动态的分页查询&#xff0c;将查询页数和分页数通过前端发送到后端&#xff0c;后端使用pagehelper&#xff0c;底层是封装threadlocal得到页数和分页数并动态…

[Linux基础开发工具---vim]关于vim的介绍、vim如何配置及vim的基本操作方法

一、vim及其三种模式的简单介绍 Vim是一个类似于Vi的文本编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面,如多级撤销、多窗口操作、崩溃后也可以恢复、增加了稳定性、关键字自动补全、上下文自动补全等…

力扣1143. 最长公共子序列

动态规划 思路&#xff1a; 假设 dp[i][j] 是 text1[0:i] 和 text2[0:j] 最长公共子序列的长度&#xff1b;则 dp[0][j] 0&#xff0c;&#xff08;空字符串和任何字符串的最长公共子序列的长度都是 0&#xff09;&#xff1b;同理 dp[i][j] 0&#xff1b;状态转移方程&…

List使用addAll()方法报错

当使用Arrays.asList方式创建出来的list&#xff0c;在使用addAll方法的时候报错如下&#xff1a; Exception in thread "main" java.lang.UnsupportedOperationException 这个问题记录下&#xff0c;以防以后忘记。 下面是代码 List<String> objects new A…