在Unity编辑器的Scene视图进行控制播放粒子ParticleSystem,可以借助方法Simulate,具体可以参照以下例子:
创建一个空对象ParticleAll,在这个对象下添加一个粒子(要添加多个粒子的话,添加到这个粒子之下),此时选中粒子, 可以看到 Scene视图预览播放粒子效果。附上新脚本 EditParticleSystem ,此为空脚本,如下:
using UnityEngine;
public class EditParticleSystem : MonoBehaviour
{
}
创建一个这个脚本的编辑器类 EditParticleSystemInspector,代码如下:
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",即可以自动播放整个粒子,如下所示: