timeline自定义轨道Track和片段Clip实战应用(TrackAsset ,PlayableBehaviour , PlayableAsset)

这篇博客详细介绍了如何在Unity中自定义Timeline轨道TrackAsset和PlayableBehaviour,以及自定义Clip。通过创建TrackOneAssets类,实现了在20秒的Timeline中在第5秒添加标记,并在播放到第10秒时根据条件决定是否跳回第5秒循环播放。博客内容涵盖了TrackAsset的CreateTrackMixer方法、PlayableBehaviour的ProcessFrame方法,以及ClipAssets和ClipBehaviour的使用,包括条件判断和时间跳转功能。

先上效果图。由于中间切换窗口,所以timeline卡了一下:
只需要关注最下侧 start 和 jumptoStart(其它轨道请自动忽略)
在这里插入图片描述上图主要实现timeline的控制: 共20秒,在第5秒加个标记,当播放到第10秒时根据条件决定=》继续播放 or 从第10秒跳到第5秒循环播放.

一.自定义一个轨道Track :TrackAsset 和 PlayableBehaviour
二.自定义轨道上的一个Clip: PlayableAsset 和 PlayableBehaviour
三.自定Track和Clip中的 PlayableBehaviour 可以共用同一个,也可以各用各的。
1.自定义Track中设置绑定和绑定的使用:
在这里插入图片描述
在这里插入图片描述
2.轨道TrackAsset脚本说明

当自定义Clip之间有融合时,也需要声明使用CreateTrackMixer函数。
融合是依据每个Clip的权重weight进行计算此处不再过多描述。
在这里插入图片描述
3.Track中使用的PlayableBehaviour脚本说明:
在这里插入图片描述
4.Clip中的PlayableBehaviour的说明:
在这里插入图片描述
5.Clip中PlayableAsset的
在这里插入图片描述
需要用的重要的api:
获取到PlayableDirector:
PlayableBehaviour:playable.GetGraph().GetResolver() as PlayableDirector;
PlayableAsset:graph.GetResolver() as PlayableDirecto
r
下面附上整体的脚本:

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

[TrackClipType(typeof(ClipAssets))]
[TrackColor(1f,1f,1f)]
[TrackBindingType(typeof(Light))]
//[System.Serializable]
public class TrackOneAssets : TrackAsset
{
   
   
    public override Playable CreateTrackMixer(
### 创建自定义轨道以控制 Unity Timeline 中的 Fog 效果 在 UnityTimeline 系统中,可以通过创建自定义轨道来实现对雾效(Fog)的动态控制。这不仅能够增强场景的真实感,还能为游戏或动画增添更多视觉效果。 #### 定义自定义轨道类 为了使 Timeline 支持特定于 Fog 控制的功能,需先编写一个继承 `TrackAsset` 类的新脚本: ```csharp using UnityEngine; using UnityEngine.Playables; [TrackClipType(typeof(FogControlPlayable))] public class FogControlTrack : TrackAsset { public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount) { return ScriptPlayable<FogControlMixerBehaviour>.Create(graph); } } ``` 此代码片段展示了如何通过扩展 `TrackAsset` 来构建一个新的轨道类型[^1]。 #### 实现混合器行为 接着要设计一个用于处理多个剪辑输入并决定最终输出的行为逻辑——即所谓的“混音器”。这里采用的是 `PlayableBehaviour` 抽象基类的一个子类形式: ```csharp using UnityEngine; using UnityEngine.Playables; public class FogControlMixerBehaviour : PlayableBehaviour { private Color startColor; private float densityStartValue; public void Initialize(Color color,float density){ this.startColor=color; this.densityStartValue=density; } public override void PrepareFrame(Playable playable, FrameData info) { var director = (TimelineDirector)playable.Getagraph().GetResolver(); RenderSettings.fogColor = EvaluateColor(playable); RenderSettings.fogDensity = EvaluateDensity(playable); } private Color EvaluateColor(Playable playable) { /* ... */ } private float EvaluateDensity(Playable playable){/*...*/} } ``` 上述代码实现了基本框架,在实际应用时还需要补充具体的评估函数 `EvaluateColor()` `EvaluateDensity()`, 这些方法负责计算当前帧下应呈现的颜色密度值[^2]。 #### 设计可播放对象 最后一步是制作可以被放置到时间轴上的具体事件实例化模板 —— 即 “clip”,它同样基于 `PlayableBehaviour` 构建而成: ```csharp using UnityEngine; using UnityEngine.Timeline; using UnityEngine.Playables; [TimelineClip(Type = typeof(FogControlClip))] public class FogControlPlayable : PlayableBehaviour { [SerializeField] AnimationCurve fogDensityOverTime; // 雾浓度随时间变化曲线 [SerializeField] Gradient fogColorOverTime; // 雾颜色渐变设置 public override void ProcessPlayble(Playable playable, FrameData info, object playerData) { Camera camera = playerData as Camera; if (!camera) return ; float timeNormalized = Mathf.Clamp01((float)(playable.GetTime()/playable.GetDuration())); RenderSettings.fogColor=fogColorOverTime.Evaluate(timeNormalized); RenderSettings.fogDensity= fogDensityOverTime.Evaluate(timeNormalized); } } ``` 这段 C# 脚本允许开发者指定两个属性:一个是描述整个期间内雾浓度过程的 `AnimationCurve`; 另一个是表示色彩过渡过程的 `Gradient`. 当这些参数随着序列进度而改变时,就会相应调整全局渲染设定中的 Fog 参数[^3]. 完成以上三部分开发工作之后,便可以在编辑器界面里轻松地向任何 timeline 添加此类特殊用途的轨道,并利用其内置工具直观地配置所需的效果特性.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值