Unity Timeline运行时脚本控制Mute和UnMute
最近遇到了一个问题就是希望能够在运行时脚本控制Timeline特定轨道的mute和unmute,本来以为是一个很简单的问题,结果发现并没有直接的API方法可以用,并且Unity官方论坛上也有很多相关讨论,这才发现原来没有那么容易。不过最终还是找到了行之有效的方法,并上传到了官方论坛上。虽然是一个简单的需求,但是这其中有几个点不得不提。
- Unity在Timeline控制上有些bug。在最初我使用2019.1.4f1版本,计划用signal调用mute或unmute函数,结果每次遇到signal,程序直接崩溃,崩溃率100%,后来确认了这是一个bug,据说在2020.1已结修好了,这次我换用了2020.3测试,果然是好的了。
- 如果timeline只有一条轨道,那么这条唯一的轨道被mute掉之后时间线会立刻回到0,哪怕你记录了track的时间。所以需要增加一条轨道来使时间线维持正常运作。
- timeline的轨道序号不是从0开始的,是从1开始的。
最终代码如下:
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
public class timeLineMuteUnMute : MonoBehaviour
{
PlayableDirector m_PlayableDirector;
TimelineAsset m_TimelineAsset;
// Start is called before the first frame update
void Start()
{
m_PlayableDirector = FindObjectOfType<PlayableDirector>();
m_TimelineAsset = (TimelineAsset)m_PlayableDirector.playableAsset;
}
public void MuteTrack(int inNum)
{
TrackAsset theTrack = m_TimelineAsset.GetOutputTrack(inNum);
theTrack.muted = true;
double t0 = m_PlayableDirector.time;
m_PlayableDirector.RebuildGraph();
m_PlayableDirector.time = t0;
m_PlayableDirector.Play();
}
public void UnMuteTrack(int inNum)
{
TrackAsset theTrack = m_TimelineAsset.GetOutputTrack(inNum);
theTrack.muted = false;
double t0 = m_PlayableDirector.time;
m_PlayableDirector.Stop();
m_PlayableDirector.time = t0;
m_PlayableDirector.Play();
//You can also use this function.
//TrackAsset theTrack=m_TimelineAsset.GetOutputTrack(inNum);
//theTrack.muted = false;
//double t0 = m_PlayableDirector.time;
//m_PlayableDirector.RebuildGraph();
//m_PlayableDirector.time = t0;
//m_PlayableDirector.Play();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.M))
MuteTrack(2);
if (Input.GetKeyDown(KeyCode.U))
UnMuteTrack(2);
}
}