[unity]TimeLine自定义脚本(自己复习用)

前几天在Unity官方学了学,如何使用Timeline以及cinemachine的方法, 学习了如何写自定义脚本,模仿着做一下,写一篇笔记来巩固一下,希望以后复习的时候不会忘记。

https://www.bilibili.com/video/BV1EK4y177c9?t=2029 //观看的视频,UP主讲的超级好

一开始我们先看看原本的Timeline里的各个轨道
Activation Track(控制物体的显示和隐藏)
Animation Track(为物体加入动画,可以在场景中方便地录制动画,也可以是已经制作好的Animation Clip)
Audio Track(为动画添加音效,并可对音效进行简单的裁剪和操作)
Control Track(在该轨道上可以添加粒子效果,同时也可以添加子Timeline进行嵌套)
Playable Track(在该轨道中用户可以添加自定义的播放功能)
Track Group(将不同的轨道进行分类,相当于文件夹功能)

当然,要实现更加天马星空的想法,需要我们来自定义脚本

我们要明白Timeline里面的四个要素
分别为
Track 轨道部分
Clip 轨道上面的片段部分
Behavior 片段的行为?貌似也可以交Data
Mixed 关于片段直接混合的部分

首先是关于Track部分:

using UnityEngine.Timeline;
//此标签能让轨道绑定某个物体,如果在动画中要调用多个物体的时候,感觉一般会在behavior中去调用别的的
[TrackBindingType(typeof(GameObject))]
//标签决定轨道的颜色
[TrackColor(230 / 255f, 230 / 255f, 0 / 255f)]
//标签决定轨道能够连接的clip,我的理解为是Track和clip之间的绑定,我们只要写要在这个Track上播放的clip就好了
[TrackClipType(typeof(DialogueClip))]

//这里的继承,为TrackAsset
public class DialogueTrack : TrackAsset
{
}

然后是Clip的部分,代码如下

//这里继承的为PlayableAsset部分,因此命名空间改为Playables
using UnityEngine.Playables;
//继承PlayableAsset
public class DialogueClip : PlayableAsset
{
//PlayableAsset为抽象类,先实现其一个方法CreatePlayable,在其中通过ScriptPlayable方法的一个重写来绑定自己定义的Behavior
//(当时写的时候太快写成了Behabior了哈哈哈哈)
//如果不用template传回来好像会出现在clip上面无法显示的问题
public DialogueBehabior template = new DialogueBehabior();
    public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
    {
        var playable = ScriptPlayable<DialogueBehabior>.Create(graph,template);
        return playable;
    }
}

然后是Behavior的部分

//同样我们使用这个命名空间
using UnityEngine.Playables;
//序列化,才能够在Timeline窗口上找到各个参数
[System.Serializable]
//继承于PlayableBehaviour
public class DialogueBehabior : PlayableBehaviour
{
//在这里中可以去自定义各种各样天马星空的想法,包括各种UI或者灯光,粒子特效等等
//不过要先定义一个PlayableDirector类(一个类似于导演的类,控制的动画的各种各样)
private PlayableDirector playableDirector;
//在这个类中,有3个比较重要的方法

//在创建的时候调用
public override void OnPlayableCreate(Playable playable)
    {
    //此时,给“导演”赋值,可以类比于实例化吗?别人通过调用这个来控制自己的动画
        playableDirector = playable.GetGraph().GetResolver() as PlayableDirector;
    }
//每次更新的时候都会调用这个函数
public override void ProcessFrame(Playable playable, FrameData info, object playerData)
    {
    }
//在动画播放结束的时候调用这个函数
public override void OnBehaviourPause(Playable playable, FrameData info)
    {
    }
}

在Timeline中还有一个signal,可以用来在某一刻调用外部的某些方法,非常的方便好用QAQ

### 创建自定义轨道以控制 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 添加此类特殊用途的轨道,并利用其内置工具直观地配置所需的效果特性.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值