Unity 编辑器下控制播放粒子

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

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity Timeline是Unity中的一个时间轴编辑器,可以用于控制游戏中的动画、音频、粒子效果等的播放。通过Timeline,开发者可以在时间轴上创建关键帧,设置动画的起始和结束时间,以及添加动画效果和音频等元素,从而实现对游戏中各种元素的精细控制。同时,Timeline还支持多个轨道的编辑,可以同时控制多个元素的播放,提高开发效率。 ### 回答2: Unity Timeline是一种在Unity控制动画以及创造交互体验的工具,它可以把一堆动画资源整合在一起来形成一个完整的动画场景。具体来说,它是一个可视化编辑器,可以通过图形化的界面去创建,编排和掌控动画序列。它的出现解决了Unity本身在动画编辑方面的不便利之处。 Unity Timeline的主体包括Track、Clips、Timeline、Keyframe、Group等多个关键概念。使用该工具可以将一系列的剪辑片段戏剧化地串联起来,达到较为流畅的动画效果。该工具可以用于游戏中的角色动画、用户交互、UI动画、电影等多个方面,增强游戏的沉浸感和用户体验。 在使用Unity Timeline时,首先需要添加一个Timeline实例至场景中,然后双击Timeline实例,即可进入Timeline的编辑界面。然后,用户可以在其中添加各种Track,如动画轨道、音效轨道、粒子轨道等,然后在每个Track中添加对应的动画片段Clips。Clips可以是一段动画,也可以是一个AudioClip、ParticleSystem和一些脚本事件等,通过在Track上拖拽Clips来填充这个Timeline。填充好后,在Timeline的时间轴上可以看到各个Clip的位置、长度和起始时间等属性,通过拖动Clip或序列上的播放头,可以控制播放进度和播放速度。 在轨道的属性中也可以设置更多的控制参数,如淡入淡出控制、循环次数、反向播放、加速度控制等等。同时,Timeline也支持自定义的动画状态机,可以添加一些交互事件,根据用户的输入改变动画状态。Timeline可以通过代码进行控制脚本中可以获取实例化的Timeline、对Track、Clip进行控制,同时支持Timeline事件的回调,有助于定制游戏中的复杂动画和交互。 总体来说,Unity Timeline提供了快捷、可视化的动画编辑、管理工具,让动画制作更加友好,可以更好地与实际应用场景结合,为游戏和其他应用程序提供更为出色的动画效果和交互式体验。 ### 回答3: Unity Timeline 控制播放是一个非常有用的工具,它可以让开发人员通过时间线来控制游戏的行为。 Unity Timeline 是一个非常强大的工具,它可以让开发人员在游戏中实现复杂的交互和动画效果。 在 Unity 中使用 Timeline 控制播放的步骤如下: 1. 创建一个时间线: 在 Unity 中创建一个时间线对象,然后将它添加到场景中。这个时间线对象可以用于控制游戏中的各种元素,例如活动、声音、视频和动画等。 2. 在时间轴上放置关键帧: 在时间轴上放置关键帧以定义场景的不同状态。每个关键帧可以包含多个动作,例如更改位置、旋转角度或播放声音等。 3. 添加行为: 通过添加行为来定义每个关键帧上的动作。行为可以是脚本、动画或音频等。 4. 调整时间轴的速度: 可以通过更改时间轴的速度来控制动画的速度。将速度设置为大于1可以加速动画,将速度设置为小于1可以减速动画。 5. 随时运行时间轴: 在游戏中随时可以运行时间轴,从而将游戏带入不同的状态。例如,可以在菜单上添加按钮,让玩家触发时间轴的执行。 总之,Unity Timeline 控制播放是一种非常有用的工具,可以让开发人员在游戏中实现复杂的动画和交互效果。通过创建时间线,放置关键帧,添加行为并调整速度等步骤,可以很容易地实现这些效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值