首页 > 其他分享 >如何在Timeline中创建自定义轨道?

如何在Timeline中创建自定义轨道?

时间:2023-04-28 15:08:36浏览次数:49  
标签:light 自定义 Timeline 轨道 Light public


你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦。

用过一段时间Timeline后,我问大智:“Timeline中只有这么几个轨道么?我发现有的需求这些轨道根本没办法满足,使用之前学过的Playable Track也很麻烦,还有其他办法么?”

大智:“你遇到了什么问题呢?”

小新:“之前咱们学的那个Playable轨道其中一个问题是:每次添加自定义clip时,都需要给它指定Light组件,如果Clip很多,会非常麻烦。”

大智:“这个还好,不算个大问题,多选就能一次搞定。不过你可能更需要的是自定义轨道。使用自定义轨道有几个好处:”
1、可以发挥你的脑洞,用代码实现出无限的可能
2、可以解决轨道的绑定(如下图中的Bound object)问题,只需要绑定一次,轨道上的所有Clip都可以访问。比如Animation Track、Activation Track都是这样的。
3、Playable Track上如果混用很多类型的Clip时,最后会很混乱,也不直观。自定义轨道可以直观地将不同用途的轨道区分开。

如何在Timeline中创建自定义轨道?_sed

那我们来看看如何把之前学习Playable轨道时的自定义Light Clip改成自定义轨道,然后绑定Light组件。

注意下面是基于之前的Playable轨道这一节学习的,如果还没学习,建议先去学习Playable轨道

自定义轨道

首先需要创建一个自定义轨道的脚本,继承TrackAsset:

using UnityEngine;
using UnityEngine.Timeline;

[TrackClipType(typeof(LightControlAsset))]
[TrackBindingType(typeof(Light))]
public class LightControlTrack : TrackAsset {}

这段代码用了两个Attribute:

  • TrackClipType指定了轨道接收的PlayableAsset类型;
  • TrackBindingType指定了轨道要求绑定的对象类型。

现在还需要修改PlayableAsset和PlayableBehaviour,也就是之前的LightControlAsset和LightControlBehaviour。

LightControlBehaviour的代码如下:

using UnityEngine;
using UnityEngine.Playables;

public class LightControlBehaviour : PlayableBehaviour
{
   //public Light light = null; 不再需要它了
   public Color color = Color.white;
   public float intensity = 1f;

   public override void ProcessFrame(Playable playable, FrameData info, object playerData)
   {
       Light light = playerData as Light; // 这个地方有变化

       if (light != null)
       {
           light.color = color;
           light.intensity = intensity;
       }
   }
}

PlayableBehaviour中就不再需要Light成员变量了,因为可以从方法的playerData中获取到,转换成对应的类型即可。

using UnityEngine;
using UnityEngine.Playables;

public class LightControlAsset : PlayableAsset
{
   //public ExposedReference<Light> light; 不需要它了
   public Color color = Color.white;
   public float intensity = 1f;

   public override Playable CreatePlayable (PlayableGraph graph, GameObject owner)
   {
       var playable = ScriptPlayable<LightControlBehaviour>.Create(graph);

       var lightControlBehaviour = playable.GetBehaviour();
       //lightControlBehaviour.light = light.Resolve(graph.GetResolver());
       lightControlBehaviour.color = color;
       lightControlBehaviour.intensity = intensity;

       return playable;   
   }
}

PlayableAsset中也不需要再保留ExposedReference了,轨道会直接提供这个Light对象。

在Timeline中添加

现在就可以在Timeline中直接添加Light Control Track了。

如何在Timeline中创建自定义轨道?_Time_02

添加Track后,需要设置绑定的对象。这样每个Clip都可以获取到这个绑定的对象。

如何在Timeline中创建自定义轨道?_Time_03

就可以像内置的Track一样使用啦!

总结

自定义轨道可以支持你任意发挥,甚至可以让Timeline变成一个非线性运行,可交互的序列动画,是不是又勾起了你的兴趣?那就快来跟我小新一起来吧。

【扩展学习】在洪流学堂公众号回复timeline可以下载Timeline&Cinemachine系列教程全文带目录PDF


好了,今天就就让小新絮絮叨叨到这里了。没讲清楚的地方欢迎评论,不点赞收藏我可能不会回复你的哦(¬、¬) (¬_¬)

我是大智,你的技术探路者,下次见!

别走!点赞收藏哦!

好,你可以走了。


标签:light,自定义,Timeline,轨道,Light,public
From: https://blog.51cto.com/u_5746184/6234167

相关文章

  • 揭开Timeline中Playable Track的神秘面纱
    你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦。大智:“小新,学习PlayableTrack之前你了解它么?”小新:“还真不了解,我尝试过,但是添加以后一片空白,啥都没有,就不知道该怎么用了。”大智:“那估计有很多同学也遇到过这种情况,你今天就带着大家一起探索下吧。”小新:“......
  • Timeline的Animation Track详解
    你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦。在Timeline中,AnimationTrack可能是我们用的最多的一个轨道了,而且功能也相对比较多,今天小新就来总结一下AnimationTrack经常用到的那些功能。在Timeline中录制基本动画你可以直接在Timeline的Animation轨道上录......
  • Hibernate查询返回自定义对象
    /***Convertqueryresulttovolistutilclass.*/classAliasToBeanResultTransformerimplementsResultTransformer{privatestaticfinallongserialVersionUID=-5199190581393587893L;privatefinalClass<T>resultCla......
  • aop实现日志记录通过自定义注解方式
    切面类切入点引入注解@Pointcut("@annotation(com.test.aop.MyLog)")privatevoidpointcut(){}注解类@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)//指定实现的类型及运行时机public@interfaceMyLog{}在使用的方法上加自定义注解@MyLog方法log.i......
  • css cursor: url 自定义鼠标光标遇到的坑
    1、大小不能大于32*32(切记)本人就是在这个上面栽了很久,一直出不来2、最好是ico,cur格式3、使用绝对路径4、在逗号后面加通用游标,如官网所写 示例:map.style.cursor="url('/img/cursor.ico'),pointer";附:在线修改图片大小网址:在线图片大小修改器,图片尺寸修改,格式转换【免费】png等......
  • C/C++ 自定义结构体直接用自定义结构体=赋值
    自定义结构体中没有管理堆空间对象的指针structst_t{inta;shortb;charc;chars[128]={0};};对比使用=和memcpy的汇编代码 结论 两者均调用了memcpy,结构体中不带指针(管理堆空间),可以直接使用浅拷贝,不过个人倾向后者,显式调用memcpy。......
  • 【CPP】自定义排序--针对智能指针
    目录代码块代码块#include<iostream>#include<memory>#include<vector>#include<algorithm>usingnamespacestd;classBase{public:virtualvoidPrint(){std::cout<<"IamBase!\n";}};classDerived1:publi......
  • 【动手学深度学习】第五章笔记:层与块、参数管理、自定义层、读写文件、GPU
    为了更好的阅读体验,请点击这里由于本章内容比较少且以后很显然会经常回来翻,因此会写得比较详细。5.1层和块事实证明,研究讨论“比单个层大”但“比整个模型小”的组件更有价值。例如,在计算机视觉中广泛流行的ResNet-152架构就有数百层,这些层是由层组(groupsoflayers)的重复模......
  • 博客园自定义皮肤设置2
    博客园自定义皮肤设置-21.选择皮肤LessIsMore2.博客侧边栏公告<style>#back-top{position:fixed;bottom:10px;right:5px;z-index:99;}#back-topspan{width:50px;height:64px;display:block;background:url(htt......
  • 一统天下 flutter - widget 布局类(可以有多个子): CustomMultiChildLayout - 自定义多
    源码https://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-widget布局类(可以有多个子):CustomMultiChildLayout-自定义多组件布局示例如下:lib\widget\layout\custom_multi_child_layout.dart/**CustomMultiChildLayout-自定义多组件布局*......