前几天在Unity官方学了学,如何使用Timeline以及cinemachine的方法, 学习了如何写自定义脚本,模仿着做一下,写一篇笔记来巩固一下,希望以后复习的时候不会忘记。
https://www.bilibili.com/video/BV1EK4y177c9?t=2029 //观看的视频,UP主讲的超级好
一开始我们先看看原本的Timeline里的各个轨道
Activation Track(控制物体的显示和隐藏)
Animation Track(为物体加入动画,可以在场景中方便地录制动画,也可以是已经制作好的Animation Clip)
Audio Track(为动画添加音效,并可对音效进行简单的裁剪和操作)
Control Track(在该轨道上可以添加粒子效果,同时也可以添加子Timeline进行嵌套)
Playable Track(在该轨道中用户可以添加自定义的播放功能)
Track Group(将不同的轨道进行分类,相当于文件夹功能)
当然,要实现更加天马星空的想法,需要我们来自定义脚本
我们要明白Timeline里面的四个要素
分别为
Track 轨道部分
Clip 轨道上面的片段部分
Behavior 片段的行为?貌似也可以交Data
Mixed 关于片段直接混合的部分
首先是关于Track部分:
using UnityEngine.Timeline;
//此标签能让轨道绑定某个物体,如果在动画中要调用多个物体的时候,感觉一般会在behavior中去调用别的的
[TrackBindingType(typeof(GameObject))]
//标签决定轨道的颜色
[TrackColor(230 / 255f, 230 / 255f, 0 / 255f)]
//标签决定轨道能够连接的clip,我的理解为是Track和clip之间的绑定,我们只要写要在这个Track上播放的clip就好了
[TrackClipType(typeof(DialogueClip))]
//这里的继承,为TrackAsset
public class DialogueTrack : TrackAsset
{
}
然后是Clip的部分,代码如下
//这里继承的为PlayableAsset部分,因此命名空间改为Playables
using UnityEngine.Playables;
//继承PlayableAsset
public class DialogueClip : PlayableAsset
{
//PlayableAsset为抽象类,先实现其一个方法CreatePlayable,在其中通过ScriptPlayable方法的一个重写来绑定自己定义的Behavior
//(当时写的时候太快写成了Behabior了哈哈哈哈)
//如果不用template传回来好像会出现在clip上面无法显示的问题
public DialogueBehabior template = new DialogueBehabior();
public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
{
var playable = ScriptPlayable<DialogueBehabior>.Create(graph,template);
return playable;
}
}
然后是Behavior的部分
//同样我们使用这个命名空间
using UnityEngine.Playables;
//序列化,才能够在Timeline窗口上找到各个参数
[System.Serializable]
//继承于PlayableBehaviour
public class DialogueBehabior : PlayableBehaviour
{
//在这里中可以去自定义各种各样天马星空的想法,包括各种UI或者灯光,粒子特效等等
//不过要先定义一个PlayableDirector类(一个类似于导演的类,控制的动画的各种各样)
private PlayableDirector playableDirector;
//在这个类中,有3个比较重要的方法
//在创建的时候调用
public override void OnPlayableCreate(Playable playable)
{
//此时,给“导演”赋值,可以类比于实例化吗?别人通过调用这个来控制自己的动画
playableDirector = playable.GetGraph().GetResolver() as PlayableDirector;
}
//每次更新的时候都会调用这个函数
public override void ProcessFrame(Playable playable, FrameData info, object playerData)
{
}
//在动画播放结束的时候调用这个函数
public override void OnBehaviourPause(Playable playable, FrameData info)
{
}
}
在Timeline中还有一个signal,可以用来在某一刻调用外部的某些方法,非常的方便好用QAQ