IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity简单爆炸效果的实现 -> 正文阅读

[游戏开发]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("结束方位记录完毕");
    }
}

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 14:22:27  更:2022-01-08 14:22:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 18:23:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码