Unity_TimeLine笔记

Unity_TimeLine笔记

  • 原理分析(个人看法)
    • 简要说明Playable
    • TimeLine
  • TimeLine构成
    • TimeLineAsset(不确定是不是叫这个,就是指Project右键创建的TimeLine文件)
    • PlayableDirector(播放器)
    • Track(轨道)
      • TrackAsset(轨道脚本,自定义脚本继承的对象)
      • 自定义TrackMixer(轨道的总处理器)
    • Clip(轨道上的动画文件)
      • PlayableAsset
      • 自定义Playable(clip的处理器)
    • PlayableBehaviour(自定义处理器要继承的脚本)
      • Clip中的函数的Playable参数指代的对象
      • TrackMixer中函数的Playable参数指代的对象
      • 生命周期函数中的FrameData info参数
    • 2019版本开始添加了Mark广播功能
  • 设计理念与实际使用
  • 杂项

PS:学习笔记,还未在项目中实际运用,如果有错误可以评论提醒一下

原理分析(个人看法)

简要说明Playable

Unity官方论坛的Playable帖子.

输入数据A
数据A的处理器
总处理器
输入数据B
数据B的处理器
输入数据C
数据C的处理器
输出

比如动画的混合,取动画A的数据与动画B的数据按混合权重插值,得到最后看到的动画
本质是为了将多个输入数据加工成一个输出数据

TimeLine

Unity官方论坛的TimeLine演示视频(有demo项目可以直接下载).
Unity官方论坛的PlayableTrack帖子(自定义轨道).
按Playable理解,每一个Track就是一个总处理器,Track上的Clip就是输入数据(处理器是另外创建的,逻辑与数据分开),当有Track同时有多个Clip在播放的时候,总处理器会按权重混合数据得到最终结果

TimeLine构成

TimeLineAsset(不确定是不是叫这个,就是指Project右键创建的TimeLine文件)

TimeLine的资源文件,临时录制的文件会保存在这个文件夹下(左边多一个小三角)

PlayableDirector(播放器)

TimeLine的播放器,类似Animator
常用属性:
duration->TimeLine总长度
time->当前动画的位置,直接设置可以实现跳转
Play()
Pause()
Resume()

Track(轨道)

TrackAsset(轨道脚本,自定义脚本继承的对象)

using UnityEngine.Timeline;

[TrackColor(0.5f, 0.5f, 0.5f)]
[TrackClipType(typeof(SangsTestClip))]
[TrackBindingType(typeof(SangsTestObj))]
public class SangsTestTrack : TrackAsset
{
    public string strTest_Track;
}

选择该Track之后Inspector界面可以编辑自定义数据

自定义轨道的参数都是用attribute的方式来初始化
TrackClipType是clip的类型
TrackBindingType是指改轨道需要指定对象的类型(动画轨道需要指定animator)

自定义TrackMixer(轨道的总处理器)

public virtual Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount);

重写TrackAsset的CreateTrackMixer方法
主要用来处理自定义clip的混合,具体使用后面会举例子

Clip(轨道上的动画文件)

PlayableAsset

Project界面右键Create\Playables\Playerable Asset
有默认的脚本模板

继承PlayableAsset脚本即可
同Track,也可以在Inspector界面编辑自定义数据

自定义Playable(clip的处理器)

public abstract Playable CreatePlayable(PlayableGraph graph, GameObject owner);

重写PlayableAsset的CreatePlayable方法返回自定义的脚本

PlayableBehaviour(自定义处理器要继承的脚本)

Project界面右键Create\Playables\Playerable Behaviour
有默认的脚本模板,自动重写了相关生命周期的函数

Clip中的函数的Playable参数指代的对象

指当前动画的处理器
使用:

//获取当前TimeLine的播放器
PlayableDirector director = (playable.GetGraph().GetResolver() as PlayableDirector);

常用属性:
playable.GetTime()->当前Clip所处于的位置
playable.SetTime()->设置当前Clip播放的位置,但是不会影响到PlayableDirector的播放
playable.GetDuration()->当前Clip的长度

TrackMixer中函数的Playable参数指代的对象

指当前Track中Binding的对象

[TrackBindingType(typeof(Platoon))]
public class AICommandTrack : TrackAsset{}

public class AICommandMixerBehaviour : PlayableBehaviour
{
	private Platoon trackBinding;
    public override void ProcessFrame(Playable playable, FrameData info, object playerData)
    {
		trackBinding = playerData as Platoon;
	}
}

获取当前该轨道上播放的Clip的处理器

for (int i = 0; i < playable.GetInputCount(); i++)
{
	//获取每个输入的权重
	float inputWeight = playable.GetInputWeight(i);
	//每个输入的对象
	ScriptPlayable inputPlayable =(ScriptPlayable)playable.GetInput(i);
	AICommandBehaviour input = inputPlayable.GetBehaviour();
}

设计思路:当需要使用TrackMixer来混合自定义Clip时,可以让自定义的Clip不做实际操作,只计算出结果(比如移动的向量),然后由TrackMixer来跟进各个Clip的Weight来混合得到最终结果后,在实际操作(各个移动向量*各自权重后相加得到最终结果)

生命周期函数中的FrameData info参数

当前这一帧的信息
常用属性:
info.deltaTime->这一帧的时间(类别Time.deltaTime)
info.weight->clip的处理器使用,获取当初的权重,TrackMixer可以由playable获取输入对应的权重

2019版本开始添加了Mark广播功能

本质封装了一套事件的发送接收系统
mark的帖子

设计理念与实际使用

一.数据与处理器分离
需要的数据在Track跟Clip脚本上配置,处理器只在创建时初始化Track或者Clip上的数据

二.处理器设计成类似Lerp的样式
根据时间算出当前Clip的进度(0-1),而且同样的进度一定得到同样的结果。

杂项

一.添加Control Track轨道可以在该轨道上添加PlayableDirector
该轨道上的Clip的Advanced下面的ControlPlayableDirectors变量,为true时操作主PlayableDirector时,轨道上的PlayableDirector也会一起被操作(暂停,跳时间等)。为false时只收开始跟结束(Clip的长度)
嵌套的帖子

二.录制动画
新建AnimationTrack轨道,点击右边的小红点即可开始录制,右键点击Edit in animation Window可以在在动画编辑界面操作
录制的帖子

三.为什么只要继承了脚本,编辑器就能找到
C#反射原理,可以获取项目里面所有脚本的类型
(反射NB)

//获取当前项目所有的脚本,不包括DLL
Type[] types = Assembly.GetExecutingAssembly().GetTypes();

你可能感兴趣的:(Unity,TimeLine,游戏开发)