编辑器控制特效播放

Unity的动画编辑器不能预览粒子系统的播放,为了方便预览特效,设想制作一个预览特效的工具,通常一个特效有三种组件:

- Animation

- Animator

- ParticleSystem

其中Unity编辑器在编辑器模式下会控制粒子的播放,所以这里控制特效播放的功能只能在播放模式下使用。

代码

using UnityEngine;
using UnityEditor;
using System; public class EffctPlayBackWin : EditorWindow {
[MenuItem("Tools/EffctPlayBack")]
static void DoIt() {
GetWindow<EffctPlayBackWin>();
} private Transform _root;
private ParticleSystem[] _particles;
private Animation[] _animations;
private Animator[] _animators;
private float _time;
private int frameCount = 5 * 60 + 1; private Rect _rect = new Rect(5, 5, 300, 600); private void OnGUI() {
EditorGUIUtility.labelWidth = 60f;
GUILayout.BeginArea(_rect);
{
//get those components from root transform
EditorGUI.BeginChangeCheck();
_root = EditorGUILayout.ObjectField("root:", _root, typeof(Transform), true) as Transform;
if (EditorGUI.EndChangeCheck()) {
FindComponets();
} //use slider to control Animation,Animator and a ParticleSystem playback
EditorGUI.BeginChangeCheck();
_time = EditorGUILayout.Slider("Time:", _time, 0, 5);
if (EditorGUI.EndChangeCheck()) {
PlayBackAnimation();
PlayBackAnimator();
PlayBackParticle();
} GUILayout.Space(10);
}
GUILayout.EndArea();
EditorGUIUtility.labelWidth = 0f;
} private void PlayBackParticle() {
if (_particles != null) {
foreach (var psys in _particles) {
//need to close the random seed to control ParticleSystem playback
psys.useAutoRandomSeed = false;
// Simulate the ParticleSystem to the time
psys.Simulate(_time);
}
}
} private void PlayBackAnimation() {
if (_animations != null) {
foreach (var animation in _animations) {
if (animation.clip) {
var state = animation[animation.clip.name];
if (state) {
animation.Play(state.name);
state.time = _time;
state.speed = 0f;
}
}
}
}
} private void PlayBackAnimator() {
if (_animators == null)
return;
foreach (var at in _animators) {
at.playbackTime = _time;
at.Update(0);
}
} private void FindComponets() {
if (_root) {
_animations = _root.GetComponentsInChildren<Animation>();
_animators = _root.GetComponentsInChildren<Animator>();
_particles = _root.GetComponentsInChildren<ParticleSystem>(); //Bake Animator's animation to the buffer
if (_animators != null) {
foreach (var at in _animators) {
at.Rebind();
at.StopPlayback();
at.recorderStartTime = 0f;
at.StartRecording(frameCount);//will the recorded frames
for (int i = 1; i <= frameCount; i++) {
//recording every frame with delta time
at.Update(1.0f / 60);
}
//stop record and start playback
at.StopRecording();
at.StartPlayback();
at.playbackTime = 0f;
at.Update(0);
}
}
}
}
}

Unity编辑器 - 编辑器控制特效播放的更多相关文章

  1. Unity实现代码控制音频播放

    前言 很久没说过Unity了,现在说一下Unity用代码控制音频播放 准备工作 1.需要播放的音频 2.给需要加声音的对象加Audio Source组件 3.新建Play脚本,并绑定需要播放声音的对象 ...

  2. unity3d笔记:控制特效的播放速度

           一般在游戏中,主角或者怪物会受到减速效果,或者攻击速度减慢等类似的状态.本身动作减速的同时,衔接在角色上的特效也需要改变相应的播放速度.一般特效有三个游戏组件:   关键点就是改变Ani ...

  3. Unity VR编辑器――如上帝般创建VR内容,Project Soli google用雷达识别手势体积相当于一张 Mini SD 内存卡

    Unity VR编辑器――如上帝般创建VR内容在GDC的一个活动中,Unity首席设计师Timoni West展示了最新的Unity VR编辑器的原型系统,让你如上帝般创建VR应用,从一片空白场景开始 ...

  4. Unity基础-编辑器

    编辑器 Special Folders Hidden Folder(start with .) Standard Assets:第一批加载的文件 Editor:只在编辑下才能使用, Plugins R ...

  5. Swift实战-豆瓣电台(九)简单手势控制暂停播放(全文完)

    Swift实战-豆瓣电台(九)简单手势控制暂停播放 全屏清晰观看地址:http://www.tudou.com/programs/view/tANnovvxR8U/ 这节我们主要讲UITapGestu ...

  6. 利用OpenCV和MFC对话框建设一个有滑动条控制的播放器--转

    (一)问题的提出: OpenCV有一个很简单的播放视频文件并加载滑动条的程序,但是如何用MFC对话框来创建一个有滑动条控制的播放器呢,网络上四处搜索都没有代码可以参考,下的都是些骗子链接文件,很过分, ...

  7. Android中通过耳机按键控制音乐播放的实现

    今天在研究Android中实现Android 4.2.2源码中的Music应用的源码,关于通过耳机按键控制音乐播放的实现,有点好奇,就仔细分析了一下源码, 主要由 MediaButtonIntentR ...

  8. 基于windowsphone7的控制ppt播放

    最近突然想起了一个学长的一个利用手机控制ppt播放的一个创意,并想将其在windows phone7上实现一下. 经过几天的努力已经可以控制ppt的播放,暂停,上一张,下一张了,并且电脑会将当前ppt ...

  9. (转)在Unity3D中控制动画播放

    用Unity3D也算是好久了,但是每次做项目总还是能学到新的东西.这次做一个TPS的项目就遇到了这样一个问题,如何同时在上下半身播放不同的动画?解决方法其实是很简单,但由于对于动画资源的了解不足导致问 ...

随机推荐

  1. 使用GraphViz画caffe网络结构图

    参考http://blog.csdn.net/happynear/article/details/45440709 1. 安装pydot: sudo pip install pydot 2. 安装Gr ...

  2. supervisord的安装

    作用: 用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制. 安装流程 ...

  3. String.prototype是什么?

    String.prototype用于为某字符串对象新增方法,比如: 在javascript中有一方法replace,它是用于替换某字符串中第一个匹配的字符,如果我们想为它追加一个循环匹配所有字符的方法 ...

  4. 《Inetnet History,Technology and Security》学习笔记

    前言 本文为观看Cousera的Michigan<Internet History, Technology and Security>教程的个人学习笔记,包括了每个week的概要和个人感想 ...

  5. java 编写小工具 尝试 学习(四)

    1.在新建 的窗口上 ,添加了一个按钮后 ,给 按钮添加一个事件 ,意思就是  点击按钮后 发生什么事情!不废话 贴图 贴 代码! package jFrameDemo; import java.aw ...

  6. Linux系统NBD驱动安装拓展篇

    前言: 最近在安装中标麒麟机器的时候,发现麒麟的操作系统找不到src.rpm包,且系统内部也没有内核文件,导致正常方法安装NBD驱动无法实施.故这里找了另一种办法帮助此类型操作系统安装NBD驱动. 一 ...

  7. Redis支持的五种数据类型

    redis支持的五种数据类型: 1.string(字符串) 2.hash(哈希) Redis hash 是一个键值(key=>value)对集合. Redis hash是一个string类型的f ...

  8. Python模拟校园网登录

    最近忙着实验室的项目,学习的时间相对较少.前一段时间刚开始接触python时,依葫芦画瓢照着写了一个爬虫,爬取了某个网站的图片.当看到一张张图片自动出现在电脑屏幕上时,有些小小成就感.我想大多数人开始 ...

  9. PHP使用阿里大鱼发送短信验证

    目前,基本上所有的网站注册都要求手机绑定,并通过下发短信验证码方式验证手机的真实性,提高了用户的真实性.但是一般企业单独申请短信行业通道都比较困难,因此选择一家信誉好,稳定性.及时性强的第三方短信通道 ...

  10. 【Android】Android Studio真机调试的问题统整

    真机调试需要注意以下几个问题 [1]手机的USB调试需开启 [2]手机不能是仅充电模式,需要传输数据模式 [3]有些USB线会偷工减料,请拿一条没问题的线,例如买手机时原厂给的配线 [4]在PC端需要 ...