Unity简单爆炸效果的实现

一、简单的爆炸

  • 使用场景
    零部件的简单爆炸展示
  • 复杂爆炸,比如物体炸开后,破碎的物体沿曲线运动,而且有动力学效果,则需要更复杂的实现,本例不作讨论。
    在这里插入图片描述

二、实现的过程

  • 1、爆炸过程
    从初始位置 移动到 结束位置(position和ratation做lerp插值运动)
  • 2、收拢过程
    从结束位置 移动到 初始位置(position和ratation做lerp插值运动)

中间所有的物体都是在两点之间做匀速直线运动

  • 3、爆炸前和爆炸后的方位信息记录
    在这里插入图片描述

物体方位信息表
在这里插入图片描述
自定义的类-【物体和方位信息】

  /// <summary>
    /// 物体和方位信息
    /// 各个部件,在爆炸前和爆炸后的位置和方向信息
    /// </summary>
    [Serializable]
    public class goPositions{
        [Header("物体")]
        [SerializeField]
        public GameObject go;

        [Header("爆炸前的位置")]
        [SerializeField]
        public Vector3 positionStart;

        [Header("爆炸前的方向")]
        [SerializeField]
        public Quaternion rotationStart;

        [Header("爆炸后的位置")]
        [SerializeField]
        public Vector3 positionEnd;

        [Header("爆炸后的方向")]
        [SerializeField]
        public Quaternion rotationEnd;
    }
  • 4、爆炸的过程——插值或者pingpong
    // Update is called once per frame
    void Update()
    {
        //测试代码==================================begin
        //if (Input.GetKeyDown(KeyCode.Alpha1))
        //{
        //    Debug.Log("111");
        //    SetToStartTransform();            
        //}

        //if (Input.GetKeyDown(KeyCode.Alpha2))
        //{
        //    Debug.Log("222");
        //    SetToEndTransform();
        //}
        //测试代码==================================end

        //更新物体的位置和方向——pingpong效果
        stepValue = Mathf.PingPong(Time.time, time) / time;
        GoPositions.ForEach(x =>
        {
            x.go.transform.position = Vector3.Lerp(x.positionStart, x.positionEnd, stepValue);
            x.go.transform.rotation = Quaternion.Lerp(x.rotationStart, x.rotationEnd, stepValue);
        });
    }

三、代码清单

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Linq;

/// <summary>
/// 一个组合的物体爆炸和收拢
/// 爆炸:从初始位置 移动到 结束位置(position和ratation做lerp插值运动)
/// 收拢:从结束位置 移动到 初始位置(position和ratation做lerp插值运动)
/// 
/// 编辑器状态下的功能:
/// 没有爆炸前:    右键菜单《初始化【部件和开始方位】》,记录各个部件的原始方向和位置
/// 拖拽爆炸位置后:右键菜单《初始化【结束方位】》      ,记录各个部件的结束方向和位置
/// 
/// 说明:物体命名规则,凡是爆炸的物体(要炸开和合拢的物体),命名包含"部件"两字
/// </summary>
public class baozha : MonoBehaviour
{
    /// <summary>
    /// 物体和方位信息
    /// 各个部件,在爆炸前和爆炸后的位置和方向信息
    /// </summary>
    [Serializable]
    public class goPositions{
        [Header("物体")]
        [SerializeField]
        public GameObject go;

        [Header("爆炸前的位置")]
        [SerializeField]
        public Vector3 positionStart;

        [Header("爆炸前的方向")]
        [SerializeField]
        public Quaternion rotationStart;

        [Header("爆炸后的位置")]
        [SerializeField]
        public Vector3 positionEnd;

        [Header("爆炸后的方向")]
        [SerializeField]
        public Quaternion rotationEnd;
    }

    [Header("部件的根物体")]
    [SerializeField]
    public GameObject root;

    [Header("部件以及方位信息列表")]
    [SerializeField]
    public List<goPositions> GoPositions = new List<goPositions>();

    [Header("散开的时间")]
    [SerializeField]
    public float time;

    /// <summary>
    /// pingpong效果的进度条值
    /// </summary>
    private float stepValue;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        //测试代码==================================begin
        //if (Input.GetKeyDown(KeyCode.Alpha1))
        //{
        //    Debug.Log("111");
        //    SetToStartTransform();            
        //}

        //if (Input.GetKeyDown(KeyCode.Alpha2))
        //{
        //    Debug.Log("222");
        //    SetToEndTransform();
        //}
        //测试代码==================================end

        //更新物体的位置和方向——pingpong效果
        stepValue = Mathf.PingPong(Time.time, time) / time;
        GoPositions.ForEach(x =>
        {
            x.go.transform.position = Vector3.Lerp(x.positionStart, x.positionEnd, stepValue);
            x.go.transform.rotation = Quaternion.Lerp(x.rotationStart, x.rotationEnd, stepValue);
        });
    }

    /// <summary>
    /// 物体摆放到初始位置
    /// </summary>
    void SetToStartTransform()
    {
        GoPositions.ForEach(
            x=> 
            {
                x.go.transform.position = x.positionStart;
                x.go.transform.rotation = x.rotationStart;
            });
    }

    void SetToEndTransform()
    {
        GoPositions.ForEach(
            x =>
            {
                x.go.transform.position = x.positionEnd;
                x.go.transform.rotation = x.rotationEnd;
            });
    }


#if UNITY_EDITOR // Editor的非running状态使用
    [ContextMenu("记录【部件和开始方位】")]
#endif
    public void InitTransformStart()
    {
        GoPositions.Clear();

        root.transform.GetComponentInChildren<Transform>().Cast<Transform>().ToList()
            .ForEach(item =>
            {
                if (item.name.Contains("部件")) //
                {                    
                    goPositions gp = new goPositions();
                    gp.go = item.gameObject;
                    gp.positionStart = item.gameObject.transform.position;
                    gp.rotationStart = item.gameObject.transform.rotation;
                    GoPositions.Add(gp);
                }
                else
                {
                    //
                }
            });
        Debug.Log("初始方位记录完毕");
    }


#if UNITY_EDITOR // Editor的非running状态使用
    [ContextMenu("记录【结束方位】")]
#endif
    public void InitTransformEnd()
    {
        var allGos = root.transform.GetComponentInChildren<Transform>().Cast<Transform>().ToList();

        GoPositions.ForEach(x=> 
        {
            x.positionEnd = allGos.Where(go => go.gameObject.name == x.go.name).ToList()[0].position;
            x.rotationEnd = allGos.Where(go => go.gameObject.name == x.go.name).ToList()[0].rotation;

        });
        Debug.Log("结束方位记录完毕");
    }
}

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity实现爆炸粒子效果可以通过使用粒子系统来实现。以下是一个简单的步骤: 1. 创建一个新的空物体,命名为"Explosion"或者其他你喜欢的名字。 2. 在Inspector面板中,点击"Add Component"按钮并选择"Particle System"来添加一个新的粒子系统组件。 3. 调整粒子系统的属性来获得期望的爆炸效果。你可以通过修改以下一些常用属性来实现: - Duration(持续时间):设置为粒子发射的总时间长度。 - Start Lifetime(起始寿命):设置粒子的寿命。 - Start Speed(起始速度):设置粒子发射时的速度。 - Start Size(起始大小):设置粒子发射时的大小。 - Emission(发射):设置粒子发射的速率和数量。 - Shape(形状):设置粒子发射的形状,可以为球体、圆锥体等等。 - Color Over Lifetime(随寿命变化的颜色):设置粒子在寿命过程中的颜色变化。 4. 添加纹理和材质以增加粒子效果的视觉效果。你可以在Renderer组件中选择一个合适的纹理和材质来渲染粒子。 5. 在代码中,你可以通过调用`Play()`函数来触发爆炸效果。例如,可以在爆炸发生的位置实例化一个Explosion对象,并在适当的时机调用`GetComponent<ParticleSystem>().Play()`来开始播放粒子效果。 这只是一个简单的示例,你可以根据自己的需求进一步调整和定制粒子系统的属性和效果。希望对你有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值