您的位置:首页 > 移动开发 > Unity3D

Unity 编辑器下控制播放粒子

2016-08-30 17:49 866 查看
在Unity编辑器的Scene视图进行控制播放粒子ParticleSystem,可以借助方法Simulate,具体可以参照以下例子:



创建一个空对象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

{

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

}

}

}

检视器效果如下:



拖动滑杆,即可播放当前时间的那一帧,如下所示:



点击"Play",即可以自动播放整个粒子,如下所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: