![220b4c39ee3be34d2d0c6d929a03e10b.png](https://i-blog.csdnimg.cn/blog_migrate/6e7ff2b51fd0857f87a2d7023b0e329c.jpeg)
前言
生活总是麻烦事情不断,还是准备先把这一节内容补全收尾后再专心做些其他事情。而其他事情呢,比如说拓展圈子(找适合的人),比如说新的游戏计划,这些后面单独拿写一份出来吧,如果有兴趣的朋友可以关注下。
回到正文,这篇内容是Timeline的补齐,因为2019后unity更新了一次自定义轨道部份的内容,之前写的代码已经不适用了。但是修改的部份其实不算复杂,我们只需要了解部份接口就可以开始进行代码添加自定义的Timline片段。太过深入部份底层部份,这篇文章不会牵扯太多,因为我一贯的文章内容都是面向初学者的,这个目标基本不会改变。
Timeline自定义功能
创建轨道
打开Timeline窗口,可以看到有个名为PlayableTrack的轨道,这个轨道是默认存放我们自定义脚本的。
PS:Unity是可以增加自定义轨道的,这里像进阶的朋友可以看
![f76e88c8fc109be96e7219fe96d73d57.png](https://i-blog.csdnimg.cn/blog_migrate/3d3d623920e4b6f8a7fd76914bf81e11.jpeg)
![2a5d5e30381b63e826d337b8a7445a56.png](https://i-blog.csdnimg.cn/blog_migrate/b1a3c9bbb7d85c20dbe39d97ad599806.jpeg)
创建自定义功能片段
我们右键资源目录,创建Playable Asset C# Script
![6f510818a1a957ea63e7ff05121d64c7.png](https://i-blog.csdnimg.cn/blog_migrate/dde84c17dfd64ac919335f8718bd8596.png)
本质上,这里无非是unity帮忙建立了个C#的脚本,添加了Serializable的属性,继承其Timeline的抽象类PlayableAsset
以下为创建好的脚本
![46d0ed4bc79625a0a6f20a266effc94e.png](https://i-blog.csdnimg.cn/blog_migrate/cb44889bc3df07809f3a96ce748b7df8.png)
序列化重要的知识
Timeline文件是做为资源配置保存的,任何涉及到数据要保存成为具体文件(资源配置),都需要序列化(保存)与反序列化(读取)。因此我们创建的配置相关的脚本是必须添加Serializable属性的,这样才能保证你创建的属性能够正确的保存在硬盘中。
![dda76cce8eee3a699c311cdf376751b9.png](https://i-blog.csdnimg.cn/blog_migrate/32968b69100b9d4285e3e656a74f9f04.png)
在上面截图大家也看到了,除了Playable Asset之外还有个Playable Behaveiour脚本的创建。这里并不是一定要创建两个脚本的意思,而是Unity告诉你,它是通过分离配置和数据处理来实现功能的。
所以我们可以直接在一个脚本文件中创建两个类
下方是一个播放Dotween功能的timeline自定义功能片段
PlayTweenClip
继承PlayableAsset,用作在Timeline界面上能配置片段属性。PlayTweenClipBehaviour直接作为其变量保存,这样避免相同属性要书写两次
CreatePlayable是抽象类中必须实现的函数,目的是Timeline实例化创建成功后将配置的Behaviour类生效在这个轨道的片段上 PlayTweenClipBehaviour
继承PlayableBehaviour,这个类中的变量根据需求自己定义,务必注意的是,像Image、Text、Animator这类需要外部引用的变量,需要包裹ExposedReference,不然配置好的数据不会正确的保存在Timeline资源中
要获得该资源本身需要通过.Resolve(playable.GetGraph().GetResolver())方法获取
PS:这里你能看到PlayTweenClipBehaviour也是添加了Serializable属性的
![e21cc69d13f1f8278a9c1c5473bda2c0.png](https://i-blog.csdnimg.cn/blog_migrate/e4525ae6d8575f1191e7bd6006f47d01.jpeg)
![cebd5afdbb2bbad0efc18df29b2c775c.png](https://i-blog.csdnimg.cn/blog_migrate/d6c7587f2a5ceabb5e04e3f8f46ef5c2.jpeg)
![f43be2400bf806fd738da75f77d1642d.png](https://i-blog.csdnimg.cn/blog_migrate/33dbe6380e55c17a499f1feb41cc91b6.jpeg)
拓展框架信息
这里既然讲到了数据分离,简单扩展下框架的内容:
我们经常能听到MVC、MVP、MVVM等名字的框架,其实框架本身,无非就是M(数据)V(显示),而通过什么方式来操作数据,修改显示,就是C、P、VM部份的内容。
![d58f597876215f757f856062c0dff32c.png](https://i-blog.csdnimg.cn/blog_migrate/39daf9faf5b4aca5f2500bf0b70040bd.jpeg)
需要提醒几个注意的要点
- PlayableAsset脚本里面直接创建PlayableBehaviour的变量这是一个非常方便的写法,很多Timeline插件都是通过这种方式来创建脚本的,虽然Unity希望分开两个脚本,但是这样做无疑会更加的方便书写。
- ScriptPlayable<PlayTweenClipBehaviour>.Create(graph, Temp),这个是将我们的PlayableBehaviour正确生效到PlayableGraph上,也就是建立起来了Timeline轨道本身与功能脚本的关联。PlayableGraph将会把自己表现层配置的数据传递到PlayableBehaviour让你书写的逻辑生效。这也是实现Unity在同一个轨道上,配置多个不同片段数据的功能。
![8c476a06447af5cb5d98511e24687425.png](https://i-blog.csdnimg.cn/blog_migrate/e1e4298f5b9315ffd9e82f6a3090aa3f.png)
- PlayableBehaviour的重要可继承功能函数说明
![ad3f8a57a1a61cbf058d5e7332767ced.png](https://i-blog.csdnimg.cn/blog_migrate/4dd5b4a049bd68252dd639b60e7676c4.jpeg)
OnBehaviourPlay:当Timeline进入这个片段的时候调用 OnBehaviourPause:当Timeline离开该片段时候调用,这里务必注意,并不是Timeline暂定的时候才会调用 OnGraphStart&OnGraphStop:Timeline的PlayableDirector启动与离开
- 获得播放属性信息
![0c1e2150973a5102dfc0687975ba1cdf.png](https://i-blog.csdnimg.cn/blog_migrate/d5e83a5de76fb210761800682fc64b06.png)
![1d2c4a218b368abdc525408f9d32897b.png](https://i-blog.csdnimg.cn/blog_migrate/f443cde24f7f56c25bd5adf77b8ed9da.png)
![88db2db834e6cfc6e0a81d6f20d44661.png](https://i-blog.csdnimg.cn/blog_migrate/ff4b9b963cf0ac290eff281a5fd29959.jpeg)
![6b133045907ad0456926e1a8c6b35c2f.png](https://i-blog.csdnimg.cn/blog_migrate/5e366c12369a1f7a20e138461cea7cf1.jpeg)
总结
- 自定义脚本的创建只需要PlayableAsset和PlayableBehaviour,分别处理记录数据将Timeline显示层的数据传入PlayableBehaviour中处理,而PlayableBehaviour能通过Playable和FrameData获取当前轨道信息,通过额外添加的参数属性来达到我们自定义功能的目的。
- 可以在PlayableAsset中直接定义PlayableAsset变量,达到节约代码量的目的。
引用类型的数据变量,务必需要ExposedReference来传递获取,否则会丢失无法保存。 - 需要熟悉PlayableBehaviour的关键调用函数,在不修改自定义轨道功能情况下,这个是唯一的获取关键事件点信息的信息来源。
- Timeline的拓展数据函数来源于PlayableExtensions脚本,可以通过PlayableBehaviour类中的Playable数据获取到。
工程案例代码我在之前的章节中已经存放进去了,想更了解的朋友可以去下载工程
Unity版本2019.3.2f1
https://github.com/chs71371/NovelsEditorgithub.com