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

简介: 【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”)。根据实际情况,你可能需要调整代码和音效文件路径来适应你的项目设置。


目录
相关文章
|
5月前
|
图形学
【unity实战】时间控制 昼夜交替 四季变化 天气变化效果
【unity实战】时间控制 昼夜交替 四季变化 天气变化效果
107 0
|
3月前
|
开发者 图形学 Java
揭秘Unity物理引擎核心技术:从刚体动力学到关节连接,全方位教你如何在虚拟世界中重现真实物理现象——含实战代码示例与详细解析
【8月更文挑战第31天】Unity物理引擎对于游戏开发至关重要,它能够模拟真实的物理效果,如刚体运动、碰撞检测及关节连接等。通过Rigidbody和Collider组件,开发者可以轻松实现物体间的互动与碰撞。本文通过具体代码示例介绍了如何使用Unity物理引擎实现物体运动、施加力、使用关节连接以及模拟弹簧效果等功能,帮助开发者提升游戏的真实感与沉浸感。
68 1
|
2月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
128 0
|
3月前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
101 0
|
3月前
|
开发者 图形学 C#
揭秘游戏沉浸感的秘密武器:深度解析Unity中的音频设计技巧,从背景音乐到动态音效,全面提升你的游戏氛围艺术——附实战代码示例与应用场景指导
【8月更文挑战第31天】音频设计在游戏开发中至关重要,不仅能增强沉浸感,还能传递信息,构建氛围。Unity作为跨平台游戏引擎,提供了丰富的音频处理功能,助力开发者轻松实现复杂音效。本文将探讨如何利用Unity的音频设计提升游戏氛围,并通过具体示例代码展示实现过程。例如,在恐怖游戏中,阴森的背景音乐和突然的脚步声能增加紧张感;在休闲游戏中,轻快的旋律则让玩家感到愉悦。
79 0
|
5月前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
136 2
|
5月前
|
人工智能 定位技术 图形学
【unity实战】制作敌人的AI,使用有限状态机、继承和抽象类多态 定义不同状态的敌人行为
【unity实战】制作敌人的AI,使用有限状态机、继承和抽象类多态 定义不同状态的敌人行为
128 1
|
5月前
|
安全 图形学
【unity实战】事件(Event)的基本实战使用
【unity实战】事件(Event)的基本实战使用
127 1
|
5月前
|
图形学
【unity小技巧】实现投掷物品,比如长矛,刀具,手榴弹和其他物体
【unity小技巧】实现投掷物品,比如长矛,刀具,手榴弹和其他物体
51 1
|
5月前
|
Rust 图形学
【unity实战】使用unity制作一个类似Rust的3D生存建造建筑系统,具有很好的吸附性(附项目源码)
【unity实战】使用unity制作一个类似Rust的3D生存建造建筑系统,具有很好的吸附性(附项目源码)
107 1