Unity 编辑器下控制播放粒子

本博客介绍如何在Unity编辑器的Scene视图中使用Simulate方法控制播放粒子ParticleSystem,并通过创建编辑器类实现滑动杆播放、停止及预览功能。

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

     在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",即可以自动播放整个粒子,如下所示:

### 如何在 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值