编辑器控制特效播放

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. PAT——1005. 继续(3n+1)猜想 (25)

    卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对n=3进行验证的时候, ...

  2. python 爬虫简介以及使用方法

    阶段大纲: 一. 爬虫 1. 基本操作 - 登录任意网站(伪造浏览器的任何行为) 2. 性能相关 - 并发方案: - 异步IO: gevent/Twisted/asyncio/aiohttp - 自定 ...

  3. day01 三级菜单

    知识点: 字典, for 循环,if ...else 嵌套 永辉超市 = { '食品饮料':{ '休闲食品':{ '坚果':['山核桃','腰果'], '炒货':['瓜子','花生'] }, '牛奶' ...

  4. iOS 杂笔-26(苹果禁用热更新)

    iOS 杂笔-26(苹果禁用热更新) 苹果爸爸禁用热更新小伙伴们有什么想说的吗? 苹果爸爸禁用热更新小伙伴们有什么想说的吗? 苹果爸爸禁用热更新小伙伴们有什么想说的吗?

  5. 关于MySQL自增主键的几点问题(上)

    前段时间遇到一个InnoDB表自增锁导致的问题,最近刚好有一个同行网友也问到自增锁的疑问,所以抽空系统的总结一下,这两个问题下篇会有阐述. 1. 划分三种插入类型 这里区分一下几种插入数据行的类型,便 ...

  6. centos6,python3,通过pip安装pycurl出现报错提示

    Centos6.7系统,python3.6.7,通过 pip 安装pycurl出现报错: __main__.ConfigurationError: Could not run curl-config: ...

  7. MVC action过滤器验证登录

    方法一 :  1.创建一个全局action过滤器  (在appstart  的filterconfig中注册   filters.Add(new LoginAttribute());)  2.不需要登 ...

  8. thinkphp5 rbac权限

    thinkphp 5 rbac权限 一 先创建一个数据库; 例如:创建一个test数据库;然后创建3个 表分别为:test_admin (管理员表), test_role,test_auth. 这个是 ...

  9. php的基础知识(四)

    14.数组: 索引数组: 下标就是数字开始的. $arr = ['a','b','c',1,2,3]; 关联数组: $arr = [ 'a' => 'b', 'c' => 'd'; 'e' ...

  10. Vue.js的小例子--随便写的

    1.领导安排明天给同事们科普下vue 2.简单写了两个小例子 3.话不多说直接上代码 <!DOCTYPE html> <html> <head> <meta ...