在Unity编辑器的Scene视图进行控制播放粒子ParticleSystem,可以借助方法Simulate,具体可以参照以下例子:
2 3 4 5 6 |
using UnityEngine;
public class EditParticleSystem : MonoBehaviour { } |
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
using UnityEditor;
using UnityEngine; [CustomEditor(typeof(EditParticleSystem))] public class EditParticleSystemInspector : Editor { /// <summary> /// 滑动杆的当前时间 /// </summary> private float m_CurTime; /// <summary> /// 当前是否是预览播放状态 /// </summary> private bool m_Playing; /// <summary> /// 当前运行时间 /// </summary> private float m_RunningTime; /// <summary> /// 上一次系统时间 /// </summary> private double m_PreviousTime; /// <summary> /// 滑动杆总长度 /// </summary> private const float kDuration = 30f; private ParticleSystem m_ParticleSystem; private EditParticleSystem editAnimator { get { return target as EditParticleSystem; } } private ParticleSystem particleSystem { get { return m_ParticleSystem ?? (m_ParticleSystem = editAnimator.GetComponentInChildren<ParticleSystem>()); } } void OnEnable() { m_PreviousTime = EditorApplication.timeSinceStartup; EditorApplication.update += inspectorUpdate; } void OnDisable() { EditorApplication.update -= inspectorUpdate; } public override void OnInspectorGUI() { EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Play")) { play(); } if (GUILayout.Button("Stop")) { stop(); } EditorGUILayout.EndHorizontal(); m_CurTime = EditorGUILayout.Slider("Time:", m_CurTime, 0f, kDuration); manualUpdate(); } /// <summary> /// 进行预览播放 /// </summary> private void play() { if (Application.isPlaying || particleSystem == null) { return; } m_RunningTime = 0f; m_Playing = true; } /// <summary> /// 停止预览播放 /// </summary> private void stop() { if (Application.isPlaying || particleSystem == null) { return; } m_Playing = false; m_CurTime = 0f; } /// <summary> /// 预览播放状态下的更新 /// </summary> private void update() { if (Application.isPlaying || particleSystem == null) { return; } if (m_RunningTime >= kDuration) { m_Playing = false; return; } particleSystem.Simulate(m_RunningTime, true); SceneView.RepaintAll(); Repaint(); m_CurTime = m_RunningTime; } /// <summary> /// 非预览播放状态下,通过滑杆来播放当前动画帧 /// </summary> private void manualUpdate() { if (particleSystem && !m_Playing) { particleSystem.Simulate(m_CurTime, true); SceneView.RepaintAll(); } } private void inspectorUpdate() { var delta = EditorApplication.timeSinceStartup - m_PreviousTime; m_PreviousTime = EditorApplication.timeSinceStartup; if (!Application.isPlaying && m_Playing) { m_RunningTime = Mathf.Clamp(m_RunningTime + (float)delta, 0f, kDuration); update(); } } } |
原文地址:http://blog.csdn.net/akof1314/article/details/45250767