Unity Timeline学习笔记(2) - PlayableTrack

文章介绍了PlayableTrack的使用方法,包括如何添加脚本(PlayableBehaviour和PlayableAsset),以及它们在Timeline中的行为,如OnGraphStart、OnGraphStop、OnBehaviourPlay、OnBehaviourPause和PrepareFrame的触发时机。对比了与信号Track的不同,适合在不同场景下选择合适的轨道类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PlayableTrack 是可自定义播放的轨道。我们可以通过进入轨道后调用自己的函数方法,使用起来也是比较顺手的。

添加轨道

我们点击加号添加
在这里插入图片描述
这样就有一个空轨道了,然后我们创建两个测试脚本。

添加脚本

在这里插入图片描述
分别是Playable Behaviour和PlayableAsset脚本。
Asset脚本是可以拖动到轨道上的,通过Asset脚本来调用Behaviour脚本的方法,直接贴上脚本:

首先是PlayableAsset

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;

[System.Serializable]
public class PlayableAssetTest : PlayableAsset
{
    public string testName;
    public int testInt;

    // Factory method that generates a playable based on this asset
    public override Playable CreatePlayable(PlayableGraph graph, GameObject go)
    {
        //return Playable.Create(graph);
        PlayableTest t = new PlayableTest();
        t.testName = testName;
        t.testInt = testInt;

        return ScriptPlayable<PlayableTest>.Create(graph, t);

    }
}

他在CreatePlayble的时候,我们实例化Playable Behaviour脚本,并传入想传入的参数。

Playable Behaviour的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;

// A behaviour that is attached to a playable
public class PlayableTest : PlayableBehaviour
{
    public string testName;
    public int testInt;
    // 当开始运行Timeline的时候
    public override void OnGraphStart(Playable playable)
    {
        Debug.Log("TimeLine 开始播放");
    }

    // 当停止运行Timeline的时候
    public override void OnGraphStop(Playable playable)
    {
        Debug.Log("TimeLine 停止播放");
    }

    // 当进入区域内触发Play
    public override void OnBehaviourPlay(Playable playable, FrameData info)
    {
        Debug.Log($"进入滑块区域内{testName},Int:{testInt}");
    }

    // 当出了区域触发,或者开始的时候触发,或者停止运行的时候
    public override void OnBehaviourPause(Playable playable, FrameData info)
    {
        Debug.Log($"Pause{testName},Int:{testInt}");
    }


    // 在区域内每个Frame地方都会触发
    public override void PrepareFrame(Playable playable, FrameData info)
    {
        //Debug.Log("PlayableTest PrepareFrame");
    }
}


然后我们把PlayableAssetTest 拖入轨道
在这里插入图片描述
轨道的长度位置和动画一样来调整就可以了,

运行结果和总结

我们运行看看这些函数是如何触发的。
在这里插入图片描述

我们看到在编辑器运行后,首先进入的就是OnGraphStart和OnBehaviourPause。
当播放到脚本块后,刚进入就进入了OnBehaviourPlay,当播放出了脚本块后会调用OnBehaviourPause,当整个Timeline结束后会调用到OnGraphStop。

基本上都很好理解,只有这个OnBehaviourPause比较特殊,相当于Timeline在调用播放激活的时候会调用一次,不管是不是在当前滑块范围内(滑块在第一帧)。然后当出了滑块区域会调用一次。或者Timeline被强制停止播放都会。

这里和信号(Signal Track)有很大分别,大家在使用的时候就知道如果某些东西只有在Timeline周期处理的用PlayableTrack比较合适,某些点可以用信号轨道。

PrepareFrame就更好理解了是每一帧都会进入。

### 如何在Unity中使用和控制Timeline中的Tracks #### 使用拖放方法编辑轨道内容 时间轴工具提供了一个直观的界面,允许通过简单的“拖放”操作来安排各种类型的媒体内容,如动画、音频片段、事件标记或视频素材。这种交互方式简化了复杂场景的时间线构建过程[^1]。 #### 多轨道管理特性 支持多条平行运行的不同性质的数据流(即多个轨道),每一条都可以独立设置属性,比如启用/禁用状态、音量大小调节等;同时提供了锁定机制防止误操作修改关键部分的内容,还有静音选项方便调试期间快速屏蔽某些声音源的影响。 #### 自定义扩展能力 借助于Playable API框架的支持,开发者可以根据项目需求定制特定用途的新种类轨道类型,甚至关联到游戏逻辑内部更深层次的功能模块上工作。这意味着几乎任何可序列化的资源都能够被纳入进来作为时间线上的一帧画面展示出来,并且可以通过编程手段灵活调整其行为表现形式。 #### 动画与混合权重调整 对于包含角色动作捕捉在内的动态元素而言,在此平台上可以直接手动微调各个关键时刻点的位置参数以及它们之间过渡平滑度的比例系数,确保最终输出效果达到预期的艺术标准[^2]。 ```csharp using UnityEngine; using UnityEngine.Playables; public class CustomTrackController : MonoBehaviour { private PlayableDirector director; void Start() { director = GetComponent<PlayableDirector>(); // 获取指定名称的轨道实例 var track = (AnimationTrack)director.GetGenericBinding("Your Track Name"); // 控制轨道播放速度 ((ScriptPlayable<AnimationClipPlayable>)track.CreateDefaultOutputs()).SetSpeed(2f); // 更改轨道内某个剪辑的持续时间和起始偏移 foreach(var clip in track.GetClips()) { clip.duration = 5f; // 设置新长度 clip.start = Random.Range(0, 3); // 随机化开始位置 } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinbug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值