编辑器控制特效播放

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. Semi-Supervised Dimensionality Reduction

    今天阅读了一篇关于半监督降维的论文,做个总结.这篇论文的全名叫<Semi-Supervised Dimensionality Reduction>(2006),是南大周志华老师的大作. 本 ...

  2. MBTiles 离线地图演示 - 基于 Google Maps JavaScript API v3 + SQLite

    MBTiles 是一种地图瓦片存储的数据规范,它使用SQLite数据库,可大大提高海量地图瓦片的读取速度,比通过瓦片文件方式的读取要快很多,适用于Android.IPhone等智能手机的离线地图存储. ...

  3. git提交项目

    https://www.cnblogs.com/java-maowei/p/5950930.html

  4. 如何在jsp页面获取系统时间

    <%@ page import="java.util.*"%> //获取系统时间必须导入的 <%@ page import="java.text.*&q ...

  5. HDU1398 Square Coins(生成函数)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  6. 利用MFC Picture Control控件 加载bmp,png

    1.在资源视图,选择PictureControl,并且在属性中把Type设置为Bitmap. 2.加载PNG CStatic* pWnd = (CStatic*)GetDlgItem(IDC_PIC) ...

  7. Git 远程推送被拒绝的一种解决方案

    今天在推送的时候发生了如下错误信息: error: 无法推送一些引用到 'https://gitee.com/von_w/demo_app.git'提示:更新被拒绝,因为您当前分支的最新提交落后于其对 ...

  8. double工具类

    package com.zq.utils; /** * * 经度数字操作类 * * Created by MyEclipse. Author: ChenBin E-mail: chenbin_2008 ...

  9. canvas 将html绘制图片 生成图片链接

    废话不多说,直接上代码 其中图片地址换成你的,自己玩儿去吧 <!DOCTYPE html> <html> <head> <meta charset=" ...

  10. ethereum(以太坊)(实例)--"安全的远程购买"

    pragma solidity ^0.4.10; contract Safebuy{ uint public price; address public seller; address public ...