TimeLine自定义轨道(简单版)

一.轨道基本要素

  • 轨道(Track):如下图1所示。
  • 片段(Clip):如下图2所示。
  • 行为(Behavior):与片段绑定,决定片段在轨道上的播放、暂停等行为。
  • 混合器(Mixer):决定片段与片段如何融合。(该示例为简单版,未定义Mixer)

轨道基本要素


二.自定义简单的灯光轨道

1.定义轨道(Track)脚本

  • 脚本继承自TrackAsset
  • TrackColor()特性:轨道颜色
  • TrackClipType()特性:轨道内可播放的片段类型
  • TrackBindingType()特性:轨道绑定的物体(该物体上包含可播放片段类型的组件)
  • 说明:在该示例中,灯光物体没有绑定到轨道上,而是绑定在片段上,故没有使用特性TrackBindingType()。这样,在一条轨道中,不仅能控制一个灯光的变化,还可以控制多个灯光物体的变化。
using UnityEngine.Timeline;

[TrackColor(238/255f,180/255f,180/255f)]
[TrackClipType(typeof(PracticeLightClip))]
//[TrackBindingType(typeof(PracticeLightClip))]
public class PracticeLightTrack : TrackAsset
{
}

绑定灯光物体的地方在片段上而不是在轨道上

2.定义片段(Clip)脚本

  • 脚本继承自PlayableAsset
  • ExposedReference<T>:将T类型的实例引用暴露出来的一个泛型类型,以便于在Inspector面板中直接拖拽赋值。
  • CreatePlayable():该脚本必须实现的方法,必须在该方法内创建片段并返回。
  • 更多要点见代码注释部分。
using UnityEngine;
using UnityEngine.Playables;

public class PracticeLightClip : PlayableAsset
{
    public ExposedReference<Light> lightObject;
    public Color lightColor = Color.white ;
    public float intensity = 1f;
    public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
    {
        //创建片段固定格式
        var playableAsset = ScriptPlayable<PracticeLightBehavior>.Create(graph);
        //获取片段绑定的Behavior实例
        var playableBeahavior = playableAsset.GetBehaviour();
        //从暴露引用的类型ExposedReference<Light>中获取Light类型固定格式
        playableBeahavior.lightObject = lightObject.Resolve(graph.GetResolver());
        playableBeahavior.color = lightColor;
        playableBeahavior.intensity = intensity;
        return playableAsset;
    }
}

Inspector面板中Clip属性

3.定义行为(Behavior)脚本

  • 脚本继承自PlayableBehaviour
  • ProcessFrame():当前片段上每帧执行的方法。为PlayableBehaviour生命周期函数之一。
  • 常用PlayableBehaviour生命周期函数见下表:
函数名官方解释
OnPlayableCreate拥有 PlayableBehaviour 的 Playable 创建后调用此函数。
ProcessFrame在 PlayableGraph 的 PrepareFrame 阶段调用此函数。
更多函数见官方文档https://docs.unity3d.com/cn/2021.1/ScriptReference/Playables.PlayableBehaviour.html
using UnityEngine;
using UnityEngine.Playables;

public class PracticeLightBehavior : PlayableBehaviour
{
    public Light lightObject;
    public Color color;
    public float intensity;
    public override void ProcessFrame(Playable playable, FrameData info, object playerData)
    {
        lightObject.color = color;
        lightObject.intensity = intensity;
    }
}

三.补充

  • TimeLine轨道的基本要素中,Clip一般承载片段的数据部分,BehaviorMixer一般承载片段的逻辑部分。
  • 在完整的自定义轨道中,有时为了方便Behavior调用Clip中的数据(字段),会将数据部分(字段)也定义在 Behavior部分中,这便引出了另一种创建片段的方式。

1.定义片段(Clip)脚本(另一种方式)

关键点已用注释标注。

using UnityEngine;
using UnityEngine.Playables;

public class PracticeLightClip : PlayableAsset
{
    public PracticeLightBehavior lightBehavior = new PracticeLightBehavior();    //( •̀ ω •́ )✧
    public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
    { 
        var playableAsset = ScriptPlayable<PracticeLightBehavior>.Create(graph, lightBehavior);    //( •̀ ω •́ )✧
        return playableAsset;
    }
}

2.定义行为(Behavior)脚本(另一种方式)

关键点已用注释标注。

using UnityEngine;
using UnityEngine.Playables;

[System.Serializable]    //( •̀ ω •́ )✧
public class PracticeLightBehavior : PlayableBehaviour
{
    public ExposedReference<Light> lightObject;    //( •̀ ω •́ )✧
    private Light light;
    public Color color = Color.white;
    public float intensity = 1f;

    public override void ProcessFrame(Playable playable, FrameData info, object playerData)
    {
        var graph = playable.GetGraph();
        light = lightObject.Resolve(graph.GetResolver());
        light.color = color;
        light.intensity = intensity;
    }
}

四.效果

预览


五.参考及推荐资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值