问题描述
Cutscene 使用时,有一个最大的问题,就是当Cutscene 循环播放时,会在第二次播放将actor 置为最初位置,而且无法关闭,
播放中
拉到左侧
播放完毕,回到最初位置
解决办法(一 )推荐
在官方没有解决方案的情况下,经过测试有两个办法可以解决Cutscene 重复播放位置还原问题
在播放Cutscene 的Action 脚本中使用Update 去修改位置
设置播放模式为 手动
在Update 使用设置时间的方式去播放Cutscene , 时间这里取Unity的增量时间,设置Cutscene使用Sample, CurrentTime 无法播放
time += Time.deltaTime;
//防止循环Cutscene 拉回原点
//_cutscene.currentTime = time % _cutscene.length; 无法播放
if (isLoopCutscene)
{
_cutscene.Sample(time % _cutscene.length);
}
else
{
_cutscene.Sample(time);
}
此方法Cutscene Loop 只会进入一次Enter
解决办法(二)
第二个办法不推荐使用,经过测试可以在Cutscene Enter读取位置来实现,不过直接取Actor 的 position 是无法成功的,要将Actor 的Position存在第三方位置,然后从Cutscen 内部的Clip读取,
actor.transform.position = FsmStateExtensions.RolePosition;
例如:使用静态 Vector3 ,位置改变存入,Enter 读取,
弊端,每一个Actor 都需要一个新对象/静态 读写存储位置,比较麻烦,不推荐使用
此方法Cutscene Loop 会反复进入 Enter
解决方案(三)
第三个方案主要是解决Cutscene销毁时出现的位置拉回,这个问题不是一定会出现,当Cutscene 没有定义停止模式,直接销毁时,会有概率发生拉回原点,原因是因为直接销毁之前没有调用Stop 会采用默认的stop Rewind,即还原开始的位置
因此在检查脚本执行顺序,要在Gameobject.Destory之前先调用Stop
Cutscene.Stop() //采用Cutscene 面板的停止方式
Cutscene.Stop(StopMode) //指定一种停止方式
Stop源码
还可以修改Stop的默认 改为Skip / SkipRewindNoUndo , 这样做只是避免忘记Stop时,预防措施,还是要检查脚本执行顺序,确保在Destory之前先Stop