Unity TimeLine Custom Track

If you are not familiar with TimeLine, you can watch this video first
https://www.bilibili.com/video/BV13T4y1A7Se?from=search&seid=10488791428047585833&spm_id_from=333.337.0.0

To implement a custom track in this method, the following three files need to be implemented, and the particle effect is used as an example to demonstrate
insert image description here

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;


//绑定的Clip的类型(可以是定义的,也可以是AudioClip等)
[TrackClipType(typeof(MyParticleAsset))]
// 绑定的Track对象的类型
[TrackBindingType(typeof(ParticleSystem))]
public class ParticleTrack : TrackAsset
{
    
    
    public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount)
    {
    
    
        

        foreach (var clip in GetClips())
        {
    
    
            var myAsset = clip.asset as MyParticleAsset;
            if (myAsset)
            {
    
                   
             //获得clip的持续时间 把它设置为粒子的时间
                myAsset._psInitDuration = (float)clip.duration;
            }
        }

        return base.CreateTrackMixer(graph, go, inputCount);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Timeline;
using UnityEngine.Playables;
using System;

public class MyParticleAsset : PlayableAsset
{
    
    
    public int _emitInitCount;
    [NonSerialized]
    public float _psInitDuration;
    public Color _psInitColor;
    
   //创建一个clip的时候调用的方法
    public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
    {
    
    
        // 把逻辑和资源联系起来
        var playable = ScriptPlayable<MyParticleBehaviour>.Create(graph);

        var particleControlBehavliur = playable.GetBehaviour();
  
        particleControlBehavliur._emitCount = _emitInitCount;    
        particleControlBehavliur._psDuration = _psInitDuration;
        particleControlBehavliur._psStartColor = _psInitColor;


        return playable;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;

public class MyParticleBehaviour : PlayableBehaviour
{
    
    
    public int _emitCount;   
    public int _emitFactor;
    public float _psDuration;
    public Color _psStartColor;
    private bool isInited = false;

    private ParticleSystem particle;

  

    //离开clip的时候调用的方法
    public override void OnBehaviourPause(Playable playable, FrameData info)
    {
    
    

        if (particle != null)
        {
    
    
            particle.Stop();            
        }
    }



    /// <summary>
    /// timeLine 每次更新都会执行此方法
    /// </summary>
    /// <param name="playable"></param>
    /// <param name="info"></param>
    /// <param name="playerData">就是Track中绑定的物体本身</param>
    public override void ProcessFrame(Playable playable, FrameData info, object playerData)
    {
    
    
        //Debug.Log(playable.GetPlayState<Playable>());

        _emitFactor = Time.frameCount;
         
        particle = playerData as ParticleSystem;

        if (isInited == false)
        {
    
    
            particle.Stop();
            var main = particle.main;
            var emission = particle.emission;
                //粒子的duration不能在播放的时候设置
            main.duration = _psDuration;
            main.startColor = _psStartColor;
            emission.rateOverTime = _emitCount;
            isInited = true;
        }
        else
        {
    
    
            particle.Play();
        }
        
    }
}

The effect is as follows
insert image description here

Guess you like

Origin blog.csdn.net/qq_43388137/article/details/122928287
Recommended