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

在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();
        }
    }
}
### 回答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
发出的红包

打赏作者

林新发

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

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

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

打赏作者

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

抵扣说明:

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

余额充值