目标:在目标到达一个区域内时,触发TimeLine的播放
思路:添加Camera,在跳跃时刻切换到另外视角播放翻越墙壁动画
TimeLine不是指一个制作好的mp4动画片,而是指可设置的运动、Camera、音乐等的集合,运行项目时会运行TimeLine显示我们想要的效果
1、新建名为TimeLine的空GameObject,并给它创建TimeLine(Window-TimeLine Editor),保存TimeLine
2、删掉TimeLine GameObject的Animator组件,和TimeLine窗口中的TimeLine Track
因为我们只对TimeLine GameObject的子物体做控制,不对TimeLine GameObject这个父物体做控制
3、将Main Camera拖到TimeLine制成Activation Track,新建Camera,调整好位置,用来播放跨越墙壁时的动画,赋给TimeLine做成Activation Track,取消激活Camera
但是我们发现,游戏不是在翻越墙壁时启用TimeLine,而是在刚运行时便启用了TimeLine
解决办法:取消勾选TimeLine GameObject-Inspector-Playable Director的Play On Awake选项,在player脚本添加代码,检测到某目标物体时启用TimeLine
4、在游戏场景中添加检测物体Cube,调整大小、位置(将其设置的高一点,避免挡住人物的射线检测),取消Mesh Renderer组件,勾选Box Collider中的Is Trigger,用来检测碰撞
5、给Cube添加Playable Tag,用来通过other.tag检测到它
6、给player脚本添加代码
在C#调用TimeLine的Playable Director组件,需要UnityEngine.Playables命名空间
TimeLine里的Playable Director组件,它的 PlayableDirector.Play() 方法,可直接播放对应的TimeLine
指定Player-Inspector public的Director脚本
7、将角色旋转180°,摄像头视角会因为transform.LookAt()代码旋转180°,设置角色离Cube远一点的位置,保证跳跃校测的安全距离
8、运行时我们会发现,角色并没有在刚触及Cube范围内就切换视角,是由于TimeLine中Main Camera运行的时间太长,Camera切换太慢导致
缩小Main Camera所占的时间,调大Camera占用时间
9、添加如下gif所示的观察相机
此相机制作两个轨道,一个为激活Activation Track,另一个为Animation Track
Animation Track包括拉远距离、旋转角度效果,可调节动画帧位置等设置改变持续时间和速度等参数
设置player的Animator Controller中Vault Animation-Inspector的Speed速度,可调整运行中跳跃的快慢
可在正常位置播放正常速度动画,在特定位置通过代码改变某动作播放速度(更该角色的Animator Controller...),达成慢镜头效果
但我们发现,播放完后并不会自动切换到原始Main Camera,现在所有的相机都是激活状态,我们可做一下设置解决此问题:
将三个相机的Clear Flags都设置为Skybox,Main Camera的Depth设置为1>其余两个摄像机的深度,Depth越大,显示会越靠前;在TimeLine设置TimeLine下两个Camera Post-playback state属性为Inactive,作用为播放完当前摄像头所示动画后自动取消激活当前摄像头
10、添加第四个摄像头,用来展示跳跃要结束时的动作
最终效果展示: