欢迎光临散文网 会员登陆 & 注册

[我花2个月做了叙事短篇游戏]我是如何实现剧情演出的(下)

2020-06-28 01:30 作者:皮皮关做游戏  | 我要投稿

作者:陈虹松


前言

上期传送门[我花2个月做了叙事短篇游戏]我是如何实现剧情演出的(上)

生活总是麻烦事情不断,还是准备先把这一节内容补全收尾后再专心做些其他事情。而其他事情呢,比如说拓展圈子(找适合的人),比如说新的游戏计划,这些后面单独拿写一份出来吧,如果有兴趣的朋友可以关注下。
回到正文,这篇内容是Timeline的补齐,因为2019后unity更新了一次自定义轨道部份的内容,之前写的代码已经不适用了。但是修改的部份其实不算复杂,我们只需要了解部份接口就可以开始进行代码添加自定义的Timline片段。太过深入部份底层部份,这篇文章不会牵扯太多,因为我一贯的文章内容都是面向初学者的,这个目标基本不会改变。



Timeline自定义功能


创建轨道
打开Timeline窗口,可以看到有个名为PlayableTrack的轨道,这个轨道是默认存放我们自定义脚本的。
PS:Unity是可以增加自定义轨道的,这里像进阶的朋友可以看:https://blog.csdn.net/zhenghongzhi6/article/details/104041067




创建自定义功能片段
我们右键资源目录,创建Playable Asset C# Script


本质上,这里无非是unity帮忙建立了个C#的脚本,添加了Serializable的属性,继承其Timeline的抽象类PlayableAsset
以下为创建好的脚本


序列化重要的知识
Timeline文件是做为资源配置保存的,任何涉及到数据要保存成为具体文件(资源配置),都需要序列化(保存)与反序列化(读取)。因此我们创建的配置相关的脚本是必须添加Serializable属性的,这样才能保证你创建的属性能够正确的保存在硬盘中。


在上面截图大家也看到了,除了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属性的
当创建好该脚本后,可以右键轨道看到新增的自定义片段。
PlayTweenClipBehaviour的属性已经展示了出来

拓展框架信息
这里既然讲到了数据分离,简单扩展下框架的内容:
我们经常能听到MVC、MVP、MVVM等名字的框架,其实框架本身,无非就是M(数据)V(显示),而通过什么方式来操作数据,修改显示,就是C、P、VM部份的内容。

https://www.zhihu.com/question/37475609/answer/1298931250


需要提醒几个注意的要点

  • PlayableAsset脚本里面直接创建PlayableBehaviour的变量这是一个非常方便的写法,很多Timeline插件都是通过这种方式来创建脚本的,虽然Unity希望分开两个脚本,但是这样做无疑会更加的方便书写。

  • ScriptPlayable<PlayTweenClipBehaviour>.Create(graph, Temp),这个是将我们的PlayableBehaviour正确生效到PlayableGraph上,也就是建立起来了Timeline轨道本身与功能脚本的关联。PlayableGraph将会把自己表现层配置的数据传递到PlayableBehaviour让你书写的逻辑生效。这也是实现Unity在同一个轨道上,配置多个不同片段数据的功能。

  • PlayableBehaviour的重要可继承功能函数说明

OnBehaviourPlay:当Timeline进入这个片段的时候调用
OnBehaviourPause:当Timeline离开该片段时候调用,这里务必注意,并不是Timeline暂定的时候才会调用
OnGraphStart&OnGraphStop:Timeline的PlayableDirector启动与离开
  • 获得播放属性信息

Playable获得播放属性信息,FrameData获得当前帧的时间内容信息
直接看Playable类是一个结构体,是无法得到具体播放信息的
但是可以通过直接 . 来获得其片段当前时间、持续时间等信息
Timelin扩展函数是来源脚本PlayableExtensions的

总结

  1. 自定义脚本的创建只需要PlayableAsset和PlayableBehaviour,分别处理记录数据将Timeline显示层的数据传入PlayableBehaviour中处理,而PlayableBehaviour能通过Playable和FrameData获取当前轨道信息,通过额外添加的参数属性来达到我们自定义功能的目的。

  2. 可以在PlayableAsset中直接定义PlayableAsset变量,达到节约代码量的目的。
    引用类型的数据变量,务必需要ExposedReference来传递获取,否则会丢失无法保存。

  3. 需要熟悉PlayableBehaviour的关键调用函数,在不修改自定义轨道功能情况下,这个是唯一的获取关键事件点信息的信息来源。

  4. Timeline的拓展数据函数来源于PlayableExtensions脚本,可以通过PlayableBehaviour类中的Playable数据获取到。


工程案例代码我在之前的章节中已经存放进去了,想更了解的朋友可以去下载工程

Unity版本2019.3.2f1

https://github.com/chs71371/NovelsEditor


[我花2个月做了叙事短篇游戏]我是如何实现剧情演出的(下)的评论 (共 条)

分享到微博请遵守国家法律