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 framevoid 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 updatevoid Start(){}// Update is called once per framevoid 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("记录【部件和开始方位】")]
#endifpublic 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("记录【结束方位】")]
#endifpublic 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("结束方位记录完毕");}
}
Unity简单爆炸效果的实现相关推荐
- unity 彩带粒子_Unity3D_(Shuriken粒子系统)制作简单的烟花爆炸效果
Unity中的粒子系统可以用于制作特效,如开枪火花效果,简单爆炸效果等.(毕竟程序员不是设计师,简单的特效都没有问题,要制作一些非常美观的特效还是需要多了解跟美术有关的知识.) 粒子系统实现一个简单的 ...
- Unity3D_(Shuriken粒子系统)制作简单的烟花爆炸效果
Unity中的粒子系统可以用于制作特效,如开枪火花效果,简单爆炸效果等.(毕竟程序员不是设计师,简单的特效都没有问题,要制作一些非常美观的特效还是需要多了解跟美术有关的知识.) 粒子系统实现一个简单的 ...
- Unity特效基础:简易爆炸效果
从年前摸鱼到现在,我也是够咸了.开学到现在终于能腾出时间写博客了,见谅. 接我的上一篇文章:粒子效果面板 上一篇文章我们简单介绍了Unity自带的粒子系统的大部分实用功能,这篇文章我们来实际制作一个简 ...
- Unity 2.Space Shooter(碰撞器Collider,WebGL,刚体中属性,(定时)实例化、销毁游戏对象,触碰OnTriggerEnter/Exit,爆炸效果,音频,文字,定时调方法)
目录 项目介绍 WebGL发布 游戏对象设置 灯光.相机 背景 移动游戏对象 Debug 制作子弹 射击动作 清理离开边界的游戏对象 制作危险物 添加爆炸,移动小行星,作为预制件 创建游戏控制器 循环 ...
- Unity3D 粒子系统实现一个简单的爆炸效果
一个简单的爆炸效果的实现. 先看效果. 一.准备四张贴图,做成材质 二.新建一个Particle System 1. 设置形状 2. 3. 4. 5. 6. 7. 8. 曲线的第二个点往上提一点点 9 ...
- Unity学习shader笔记[一百零八]简单萤火效果
之前用粒子系统基于原有萤火虫的粒子改了一波慢萤火效果就被惊艳到了,开始大家讨论,就都觉得这样大数量的粒子消耗挺大的,后面测试过才发现单纯的粒子系统在总粒子数量3000,每秒300的生成数量,屏幕呈现有 ...
- Unity 实现简单力场效果
Unity 实现简单力场效果 前言 效果 源码 前言 项目中要用到一个力场的效果,偶然在bilibili中找到了.记录一下. 原视频: https://www.bilibili.com/video/B ...
- 7.Unity中c#代码学习(物理系统刚体+碰撞检测(爆炸效果实现))
刚体 通过添加组件Physics/Rigidbody 实现对物体插入物理引擎(刚体) 碰撞体 查看碰撞体范围 可以编辑碰撞的范围 ...
- Unity Shader之几何着色器(Geometry Shader)实现面片飞散的爆炸效果
前言 上篇文章初学集合着色器实现了草地效果,这篇再次使用GS实现一个"爆炸效果".为什么要加上引号呢,因为实现的其实不是一个传统的爆炸效果,更类似于面片向外扩散消失的一种科幻效果, ...
- unity简单复刻无敌破坏王
使用unity简单复刻无敌破坏王总结 国庆突发奇想想简单复刻一下无敌破坏王,这里写一些总结,希望也能对大家有帮助 游戏截图: 基本思路: 时间有限,也只是简单复刻,所以只实现破坏方块的功能,画面算是广 ...
最新文章
- PyTorch nn.Module 一些疑问
- 计算机将成为学生们的老师英语,重庆英语教师
- L1-005 考试座位号 (15分) C语言实现(18行代码AC!)
- java get和post区别_HTTP请求方式GET和POST区别
- java 双声道音频_java实现切割wav音频文件的方法详解【附外部jar包下载】
- HttpClient 入门与正确使用姿势
- token详解及常见防范措施
- GNU make manual 翻译( 一百二十四)
- 全国计算机演示文稿,全国计算机等级考试二级office演示文稿题目[文].pdf
- 32位 java8u_java8下载 Java8.0U181官方正式版(32位/64位)
- 解决无法下载安装Android SDK的问题
- Struts1和Struts2对比
- matlab abort,matlab自动关闭是怎么回事???
- android 百度获取经纬度,百度地图API获取经纬度的方法
- EXCEL实现自动填充
- 魔兽世界怀旧服最新服务器开发时间,魔兽世界怀旧服明日开放,开服第一天“大部队”能升到多少级?...
- Clickhouse基础语法、数据类型、数据表引擎学习
- 应用场景一:西门子PLC通过桥接器连接MQTT服务器
- postman 安装失败 Failed to install the .NET Framework, try installingthe latest version manully
- 开启硬件辅助虚拟化——Intel虚拟化之旅