网络游戏中的角色都是动态生成的,所以如果要结合Timeline编辑剧情,就需要将动态生成的角色放入到“剧本”中。以下提供一个解决方案。
外部触发只需要提供timelineSn用于索引timeline,timelineDataSn用于索引剧情中的数据
TimelineData类用于timeline中的数据保存,通过Scriptable 序列化数据。数据主要分为演员数据和相机数据。
演员数据public struct ActorData
{
public string actorModelSn;//演员模型
public string acotrName;//演员名字,剧情中演员的唯一标识
public Vector3 actorPos;//由于演员出生位置、转角
public Vector3 actorRotation;
}
摄像机数据
public struct VCamData
{
public string vCamPrefabSn;//索引保存非场景数据的prefab
public string lookAtPart;//lookAtPart可以瞄准指定演员的指定部位
public string followActorOrPostion;//跟随演员名字或出生位置
}
- 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”键开始剧情。