一些回合制游戏中,如仙剑,一些技能华丽动画,镜头组合,是不是用timeline做的?如果是timeline,场景A的时候对怪物A使用timelineA,场景B时对怪物B也使用timelineA,我想问,timeline的对象能变化吗?总不能每个怪物都创建一个timeline,只是换了技能作用对象吧?
是的,这类技能表现、镜头组合,很多项目就是用 Timeline 做的,镜头部分一般再配合 Cinemachine。
你担心的「每个怪物都要建一个 Timeline」不用担心,关键在于:Timeline 资源本身只记录「有哪些轨道、什么时间做什么」,不记录「这条轨道控制的是哪个物体」。这个绑定关系是存在场景里的 PlayableDirector 组件上的,而且可以在运行时随时换。
所以做法是:一个技能只做一个 Timeline,播放之前把轨道重新绑到这次的施法者和目标身上。大致是这样:
var timeline = (TimelineAsset)director.playableAsset;
foreach (var track in timeline.GetOutputTracks())
{
if (track.name == "目标") director.SetGenericBinding(track, 当前怪物的Animator);
if (track.name == "施法者") director.SetGenericBinding(track, 当前角色的Animator);
}
director.Play();
需要引用 UnityEngine.Playables 和 UnityEngine.Timeline 两个命名空间。轨道名是你在 Timeline 窗口里自己起的,起个好认的名字,代码里按名字找就行。
另外几个配套的点:
1 位置:怪物站的位置每次都不一样,特效和镜头最好不要写死世界坐标。可以把整套表现放在一个根节点下,播放前把根节点移到目标脚下;或者镜头用 Cinemachine 的虚拟相机,运行时把它的 Follow 和 LookAt 指向这次的目标
2 伤害数字、受击这类「在某一帧要触发逻辑」的需求,可以用 Signal Track 打信号,在 Signal Receiver 里接收后调用你自己的伤害代码,这样表现和逻辑是分开的
这样同一个技能 Timeline 对任何怪物都能复用,换的只是播放前绑上去的对象。