关闭

Unity 编辑器下控制播放粒子

120人阅读 评论(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",即可以自动播放整个粒子,如下所示:
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

【Unity】编辑器下同时播放多个粒子特效

这里用到了http://blog.csdn.net/akof1314/article/details/45250767在编辑器下控制粒子播放的代码,我加入了多组件编辑、暂停、记录Time的功能。代码下...
  • RICKShaozhiheng
  • RICKShaozhiheng
  • 2016-10-09 16:39
  • 1133

Unity 编辑器下控制播放粒子

在Unity编辑器的Scene视图进行控制播放粒子ParticleSystem,可以借助方法Simulate,具体可以参照以下例子: 创建一个空对象ParticleAll,在这个...
  • akof1314
  • akof1314
  • 2015-04-24 20:09
  • 9948

Unity 编辑器下控制播放粒子

在Unity编辑器的Scene视图进行控制播放粒子ParticleSystem,可以借助方法Simulate,具体可以参照以下例子: 创建一个空对象ParticleAll,在这个...
  • akof1314
  • akof1314
  • 2015-04-24 20:09
  • 9948

unity粒子编辑器详解

【Unity】9.3 粒子系统生成器详解 一、简介 上一节已经介绍过了在Unity 5.x中两种创建粒子效果的方式(方式1、方式2)。 这一节我们主要学习第2种方式的基本概念和用...
  • dk_0520
  • dk_0520
  • 2016-12-28 14:17
  • 1535

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

转自:http://jingyan.baidu.com/article/f96699bbb1a0d6894f3c1b77.html 本篇教程为基础篇,针对U3D入门新手,讲解粒子系统播...
  • azhou_hui
  • azhou_hui
  • 2015-07-31 00:23
  • 16681

【U3D】粒子沿特定路径移动

本系列文章由CSDN@萌萌的一天 出品,未经博主允许不得转载。       U3D中粒子是三维空间中渲染出来的二维图像,通常来说,一个粒子系统是由粒子发射器、动画器和渲染器组成的。我们可...
  • wdmzjzlym
  • wdmzjzlym
  • 2016-05-09 16:05
  • 4567

Unity5.X- 粒子系统,粒子沿着一定的轨迹运动的研究

最近项目有个需求就是模拟油管里的油流动的效果,想想让建模的直接做一个动画是最简单!不过,自己也想用粒子系统来实现一下!初期得到不错的效果!现在的需求就是这里有一根油管,当然不是一根直直的油管,会拐弯,...
  • a615538001
  • a615538001
  • 2016-11-17 20:10
  • 589

Unity 编辑器下控制播放Animator

在Unity编辑器的Scene视图进行控制播放Animator,可以借助方法StartPlayback、StopPlayback、StartRecording和StopRecording,具体可以参照...
  • wjlsxl_whb
  • wjlsxl_whb
  • 2016-11-03 10:46
  • 567

Unity缩放粒子特效——运行状态

说明: 在Unity对模型进行缩放的时候,难免会涉及到对存在粒子特效的模型进行缩放,然后当直接修改粒子特效Scale时,并能对粒子特效进行有效的缩放,这里介绍一种,通过修改粒子系统部分可修改参数进行缩...
  • aiyan1111111
  • aiyan1111111
  • 2016-11-17 11:18
  • 3185

Unity 粒子缩放代码的实现

Unity中实现代码控制粒子的大小: Demo下载地址:http://download.csdn.net/detail/e295166319/9664243 效果图如下所示: ...
  • e295166319
  • e295166319
  • 2016-10-26 11:23
  • 810
    个人资料
    • 访问:33075次
    • 积分:398
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:40篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档