关闭

Unity 编辑器下控制播放粒子

标签: unity编辑器粒子
10281人阅读 评论(0) 收藏 举报
分类:

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

1
0
查看评论

Unity3D粒子系统——实现粒子播放完成之后自动销毁

在带有粒子系统的根对象中加入组件ParticleAutoDestruction.cs即可,其中ParticleAutoDestruction组件代码如下: using UnityEngine; using System.Collections; public class ParticleAutoD...
  • Winner_2012
  • Winner_2012
  • 2014-12-10 17:31
  • 5730

动态改变粒子系统的速度[Unity]

本文讲述了如何在运行的时候动态修改粒子系统的粒子速度。
  • cubesky
  • cubesky
  • 2014-11-03 10:14
  • 3422

Unity学习笔记(4)-----粒子效果的实现

Unity学习笔记(4)—–粒子效果的实现一.效果展示下面用若干张张动图展示效果: 大概就是这样,并不是很难。 实际效果要比图中的好一点(顺畅得多)。实现步骤大致可以分为如下几个步骤,然后逐个实现就可以了: 生产粒子 设置粒子初始属性(位置, 颜色, 速度等) 控制粒子旋转 改变粒子颜色 让颜...
  • Guo15331092
  • Guo15331092
  • 2017-04-26 15:44
  • 2841

Unity3D-代码控制粒子移动或者按照预定的路径移动(ParticleSystem)

今天在做项目中,发现很多时候我们需要做一个金币移动效果。 比如,点击某个按钮之后,按钮附近出现各种零散的金币,然后他们都会向着显示金币的框框飞。 一般如果按钮都是固定的话,那么可以直接使用一个例子系统,然后调整好方向和速度,就可以达到要求!但是呢,有时候我们需要在很多地方都会使用这个效果。 一开始,...
  • pz789as
  • pz789as
  • 2017-01-16 14:33
  • 4145

Unity3D:粒子特效(Particle System)播放序列帧动画

转自:http://jingyan.baidu.com/article/f96699bbb1a0d6894f3c1b77.html 本篇教程为基础篇,针对U3D入门新手,讲解粒子系统播放序列图的一种实现方法,随着基础教程的知识点的慢慢积累,以后将逐步展开进阶篇,项目实战篇,终极篇的讲...
  • azhou_hui
  • azhou_hui
  • 2015-07-31 00:23
  • 17088

[Unity基础]游戏暂停下播放角色与粒子动画

原文链接:http://www.unitymanual.com/thread-21763-1-1.html 代码如下: using UnityEngine; using System.Collections; public class Test : MonoBehaviour { ...
  • lyh916
  • lyh916
  • 2015-03-08 16:30
  • 1743

unity 粒子特效播放状态停止在最后一帧

using UnityEngine; using System.Collections; using System.Collections.Generic; public class Test: MonoBehaviour { public List pausePsObjNames; // U...
  • fucun1984686003
  • fucun1984686003
  • 2017-01-12 13:48
  • 875

关于Unity ParticleSystem的一些"冷"知识

目前的游戏开发中,粒子系统的使用想必是标配了,Unity自然也提供了相应的解决方案:ParticleSystem,网上对ParticleSystem的介绍也非常之多(譬如这里,这里,这里还有这里),虽然相关的资料教程不少,但多是一些如何使用之类的常规信息,对于一些虽然有些“生冷”,但仍然可能遇到的粒...
  • tkokof1
  • tkokof1
  • 2017-01-04 21:46
  • 4200

模拟粒子系统(ParticleSystem.Simulate)

using UnityEngine; using UnityEditor; [ExecuteInEditMode] public class MyWindow : EditorWindow { private GameObject _curEffect; private float...
  • aa20274270
  • aa20274270
  • 2016-06-19 18:54
  • 2001

unity particleSystem bug研究

今天处理主角技能特效遇到2个问题,和大家分享。 1.是trailRender的拖拽问题,主角技能都是放在特效池里边的,当带有trailRender的特效重复使用的时候,第二次用的拖尾可能会出现在之前射出去的位置拖到主角位置,然后再拖出去。解决方法是每次技能释放了 拖尾结束的时候把trailrende...
  • gy373499700
  • gy373499700
  • 2015-03-19 19:52
  • 2508
    个人资料
    • 访问:3557853次
    • 积分:36094
    • 等级:
    • 排名:第136名
    • 原创:402篇
    • 转载:88篇
    • 译文:5篇
    • 评论:3425条
    个人说明
    联系方式:
    文章存档
    最新评论