Unity 编辑器下用时间轴控制播放粒子

本文介绍如何在Unity编辑器中使用自定义脚本来控制粒子系统的预览播放,包括两个脚本:EditParticleSystem和EditParticleSystemInspector。通过滑动条控制粒子系统的时间,实现预览播放和停止功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Unity编辑器的Scene视图进行控制播放粒子ParticleSystem,可以借助方法Simulate

先看效果

在这里插入图片描述

代码

两个脚本: EditParticleSystem.csEditParticleSystemInspector.cs
其中EditParticleSystemInspector.cs放在Editor目录中
然后粒子物体挂EditParticleSystem脚本即可

// EditParticleSystem.cs
using UnityEngine;

public class EditParticleSystem : MonoBehaviour
{
}
// EditParticleSystemInspector.cs 
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();
        }
    }
}
### 如何在 Unity控制粒子发射器 #### 创建粒子系统 为了配置和控制粒子发射器,首先需要创建一个粒子系统。这可以通过多种方式完成: - 右键点击场景中的空白处,选择“效果”,再选择“粒子系统”[^3]。 - 或者,在Unity编辑器中,通过菜单栏选择`GameObject -> Effects -> Particle System`来新建一个粒子系统对象[^2]。 #### 调整发射模块属性 一旦有了粒子系统实例,就可以访问其内置的各种模块来进行自定义设置。对于想要调节的粒子发射行为来说,重点在于修改**Emission(发射)**模块下的几个关键参数: - **Rate over Time/Distance**: 这两个选项允许设定每秒或单位距离内的粒子生成数量。例如,如果希望随着时间推移逐渐增加粒子的数量,则可以使用曲线或者随机范围来表达这种变化趋势[^4]。 ```csharp // 设置随时间变化的发射率 ParticleSystem.EmissionModule emission = particleSystem.emission; emission.rateOverTime = new ParticleSystem.MinMaxCurve(5f); // 基础发射率为5个/s ``` - **Bursts(爆发)**: 如果项目中有瞬间大量释放的需求,比如模拟烟花绽放或是爆炸瞬间喷发许多碎片的情况,那么可以在该字段下添加多个突发事件,指定它们发生的具体时刻以及每次触发时产生的粒子数目。 ```csharp // 添加一次性的粒子爆发 var burst = new ParticleSystem.Burst(); burst.time = 1.0f; // 爆炸发生在第1秒钟 burst.minCount = 100; // 至少产生100颗粒子 burst.maxCount = 200; // 最多不超过200颗 particleSystem.main.bursts = new ParticleSystem.Burst[]{burst}; ``` 这些操作能够帮助开发者精确地掌控粒子系统的动态表现形式,从而更好地服务于游戏或其他互动体验的设计需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值