Unity 编辑器下控制播放粒子

     在Unity编辑器的Scene视图进行控制播放粒子ParticleSystem,可以借助方法Simulate,具体可以参照以下例子:

Unity 编辑器下控制播放粒子_第1张图片

创建一个空对象ParticleAll,在这个对象下添加一个粒子(要添加多个粒子的话,添加到这个粒子之下),此时选中粒子, 可以看到 Scene视图预览播放粒子效果。附上新脚本 EditParticleSystem ,此为空脚本,如下:
 C# Code 
1
2
3
4
5
6
using UnityEngine;

public  class EditParticleSystem : MonoBehaviour
{
}
创建一个这个脚本的编辑器类 EditParticleSystemInspector,代码如下:
 C# Code 
1
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
{
     /// 
     /// 滑动杆的当前时间
     /// 

     private  float m_CurTime;
    
     /// 
     /// 当前是否是预览播放状态
     /// 

     private  bool m_Playing;

     /// 
     /// 当前运行时间
     /// 

     private  float m_RunningTime;
    
     /// 
     /// 上一次系统时间
     /// 

     private  double m_PreviousTime;

     /// 
     /// 滑动杆总长度
     /// 

     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()); }
    }

     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();
    }

     /// 
     /// 进行预览播放
     /// 

     private  void play()
    {
         if (Application.isPlaying || particleSystem ==  null)
        {
             return;
        }

        m_RunningTime = 0f;
        m_Playing =  true;
    }

     /// 
     /// 停止预览播放
     /// 

     private  void stop()
    {
         if (Application.isPlaying || particleSystem ==  null)
        {
             return;
        }

        m_Playing =  false;
        m_CurTime = 0f;
    }

     /// 
     /// 预览播放状态下的更新
     /// 

     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;
    }

     /// 
     /// 非预览播放状态下,通过滑杆来播放当前动画帧
     /// 

     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();
        }
    }
}
检视器效果如下:
Unity 编辑器下控制播放粒子_第2张图片
拖动滑杆,即可播放当前时间的那一帧,如下所示:
Unity 编辑器下控制播放粒子_第3张图片
点击" Play",即可以自动播放整个粒子,如下所示:
Unity 编辑器下控制播放粒子_第4张图片

你可能感兴趣的:(3.3,Unity)