正如自定义轨道(Track)需要继承TrackAsset类那样,自定义片段(Clip)也要遵守一定的模板:继承PlayableAsset类,以及实现ITimelineClipAsset接口。
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
public class LearnClip : PlayableAsset, ITimelineClipAsset
{
}
在写好类的头部后,会出现红色波纹线提示我们出错。
快捷键 Alt + Enter 修补错误后,代码中会多出一个属性(Property)和方法(Function)。
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
public class LearnClip : PlayableAsset, ITimelineClipAsset
{
public ClipCaps clipCaps
{// ITimelineClipAsset接口的实现需求
get
{
throw new System.NotImplementedException();
}
}
public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
{// PlayableAsset类的继承需求
throw new System.NotImplementedException();
}
}
遇到陌生的名称不用慌,先查看ClipCaps的文档。
可以看到,ClipCaps中的内容都是与Clip相关的操作,印象不深的朋友可以看这篇。
片段在检视窗的内容是这样——
【补充很重要的一点,因为这些参数都需要在检视窗可以调节,所以应该给这个类添加Serializable属性】
检视窗的内容就少很多了——
所以 ClipCaps 的意义就是:被允许的功能将可以在Inspector被编辑,这些功能都是与Clip相关的操作。
CreatePlayable 方法不能单独地看,但它的总体意思就是创建一个Playable,然后插入到PlayableGraph。
它有两个参数:graph指示要插入的Graph;owner则是被创建的Playable的来源。
用户自定义的所有Playable都必须继承自PlayableBehaviour类,在自定义片段的脚本中,它需要搭配ScriptPlayable使用。
所以一个自定义Clip脚本的框架基本如下面的代码:
using System;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
[Serializable] // 序列化
public class DialogueClip : PlayableAsset, ITimelineClipAsset
{
public DialogueBehaviour template = new DialogueBehaviour (); // 一般都将变量命名为template
public ClipCaps clipCaps
{// 检视窗可调节的功能
get { return ClipCaps.None; }
}
public override Playable CreatePlayable (PlayableGraph graph, GameObject owner)
{// 创建Playable
var playable = ScriptPlayable.Create (graph, template); // 真正用来创建Playable的语句
//...这里还可以有一些赋值操作...//
return playable; // 返回创建的Playable,Clip脚本任务完成
}
}