Timeline是随Unity2017发布的新功能,由于具有直观的可视化时间轴编辑界面,并且配合Cinemachine插件可以很高效的编辑剧情镜头,所以是一个十分好的剧情工具
如何使用Timeline请参考 :例子Demo:
https://pan.baidu.com/share/init?surl=c17OMTM 密码 s9s1
教程资源:
http://edu.csdn.net/huiyiCourse/detail/453
https://zhuanlan.zhihu.com/p/29387185
而网络游戏中的角色都是动态生成的,所以如果要结合Timeline编辑剧情,就需要将动态生成的角色放入到“剧本”中。以下提供一个解决方案。
(更新于2018年11月22日)实际上Timeline所引用的物体直接拖入成为Timeline Object的子物体就可以了(如下图)。根本不用下面麻烦的操作。
外部触发只需要提供timelineSn用于索引timeline,timelineDataSn用于索引剧情中的数据
TimelineData类用于timeline中的数据保存,通过Scriptable 序列化数据。数据主要分为演员数据和相机数据。
演员数据
摄像机数据
摄像机数据分为场景数据(比如剧情演员列表,虚拟摄像机指向对象等),非场景数据(虚拟摄像机的参数控制),场景数据填写规则如下,非场景数据通过prefab来保存。
lookAtPart可以瞄准指定演员的指定部位 Actor/Part1/Part12,层级位置即是Hierachy中的层级位置,除了顶层用的是ActorData中的actorName以外其余名称都是一致的。
followActorOrPostion 如果点选了follow模式则是指定跟随演员名字,如果是非follow模式则可以自己指定虚拟相机位置。
另外加一个CreateAsset.cs 扩展Editor生成数据空壳。
作TimelineController类负责具体的timeline剧情细节,外部通过它来管理timeline剧情,而无需管具体细节。
其最主要的职责之将 剧情数据与剧情相结合,而AssemblyTimeline方法主要执行这项工作。
调用的Unity给出的接口有
PlayableAsset 的outputs数据,这里获取剧情的binding数据,然后通过binding的sourceObj获取Track的类型,然后根据Track类型分别处理。
binding列表
对于AnimationTrack:通过SetGenericBinding来设置动作的执行演员(要求有Animator)
对于CinemachineTrack:通过GetClips获取镜头列表,然后通过Director的 SetReferenceValue将场景中的虚拟相机传入Timeline 中
对于自定义的PlayableBehaviour,也是通过类似的方法来传数据。但是另外有一点需要注意的是通过GetClips获取的是PlayableAsset对象,我认为他是一个对PlayableBehaviour对象的代理,如何对接两者的具体写法可以参照我自写的ConversationPlayable类。
ScenarioObjController类用于管理剧情中的演员。
ScenarioMod类模式类来管理剧情数据,以及执行主要逻辑。
剧情的演员列表存在ScenarioMod中的一个Dictionary中,Key是Name,Value是演员的ScenarioObjController
代码工程地址:
https://pan.baidu.com/s/1eSs3jAq
主场景在TimelineAction下的scene,按”K”键开始剧情。