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
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