Unity官方论坛的Playable帖子.
比如动画的混合,取动画A的数据与动画B的数据按混合权重插值,得到最后看到的动画
本质是为了将多个输入数据加工成一个输出数据
Unity官方论坛的TimeLine演示视频(有demo项目可以直接下载).
Unity官方论坛的PlayableTrack帖子(自定义轨道).
按Playable理解,每一个Track就是一个总处理器,Track上的Clip就是输入数据(处理器是另外创建的,逻辑与数据分开),当有Track同时有多个Clip在播放的时候,总处理器会按权重混合数据得到最终结果
TimeLine的资源文件,临时录制的文件会保存在这个文件夹下(左边多一个小三角)
TimeLine的播放器,类似Animator
常用属性:
duration->TimeLine总长度
time->当前动画的位置,直接设置可以实现跳转
Play()
Pause()
Resume()
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)
public virtual Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount);
重写TrackAsset的CreateTrackMixer方法
主要用来处理自定义clip的混合,具体使用后面会举例子
Project界面右键Create\Playables\Playerable Asset
有默认的脚本模板
继承PlayableAsset脚本即可
同Track,也可以在Inspector界面编辑自定义数据
public abstract Playable CreatePlayable(PlayableGraph graph, GameObject owner);
重写PlayableAsset的CreatePlayable方法返回自定义的脚本
Project界面右键Create\Playables\Playerable Behaviour
有默认的脚本模板,自动重写了相关生命周期的函数
指当前动画的处理器
使用:
//获取当前TimeLine的播放器
PlayableDirector director = (playable.GetGraph().GetResolver() as PlayableDirector);
常用属性:
playable.GetTime()->当前Clip所处于的位置
playable.SetTime()->设置当前Clip播放的位置,但是不会影响到PlayableDirector的播放
playable.GetDuration()->当前Clip的长度
指当前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来混合得到最终结果后,在实际操作(各个移动向量*各自权重后相加得到最终结果)
当前这一帧的信息
常用属性:
info.deltaTime->这一帧的时间(类别Time.deltaTime)
info.weight->clip的处理器使用,获取当初的权重,TrackMixer可以由playable获取输入对应的权重
本质封装了一套事件的发送接收系统
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();