在做游戏时候,创建了几个不同的人物,但是他们都共用一个AnimatorController,并为每个人物创建一个CinemachineStateDrivenCamera时,会一直报错,报的错误为Animator is not playing an animation controller。报错的原因大概为Cinemachine不能同时使用一个controller,因为这样会导致其他Cinemachine找不到controller的layers层。
这是因为CinemachineStateDrivenCamera的脚本获取Controller方式所致,查阅了一些资料,可以用以下方法解决:
修改CinemachineStateDrivenCamera.cs脚本:
找到 private CinemachineVirtualCameraBase ChooseCurrentCamera(float deltaTime)函数,在此前添加函数和修改这个函数的部分代码为:
public static AnimatorController GetControllerFromAnimator(Animator animator){var overrideController = animator.runtimeAnimatorController as AnimatorOverrideController;if (overrideController){var animatorController =overrideController.runtimeAnimatorController as AnimatorController; //dirty as hellreturn animatorController;}return animator.runtimeAnimatorController as AnimatorController;}private CinemachineVirtualCameraBase ChooseCurrentCamera(float deltaTime){//UnityEngine.Profiling.Profiler.BeginSample("CinemachineStateDrivenCamera.ChooseCurrentCamera");if (m_ChildCameras == null || m_ChildCameras.Length == 0){mActivationTime = 0;//UnityEngine.Profiling.Profiler.EndSample();return null;}int layerCount = GetControllerFromAnimator(m_AnimatedTarget).layers.Length;CinemachineVirtualCameraBase defaultCam = m_ChildCameras[0];if (m_AnimatedTarget == null || m_LayerIndex < 0 || m_LayerIndex >= layerCount){mActivationTime = 0;//UnityEngine.Profiling.Profiler.EndSample();return defaultCam;}
在CinemachineVirtualCameraBaseEditor.cs
private void UpdateTargetStates(){// Scrape the Animator Controller for statesAnimatorController ac = (Target.m_AnimatedTarget == null)? null : Target.m_AnimatedTarget.runtimeAnimatorController as AnimatorController;
改为:
private void UpdateTargetStates(){// Scrape the Animator Controller for statesAnimatorController ac = (Target.m_AnimatedTarget == null)? null : CinemachineStateDrivenCamera.GetControllerFromAnimator(Target.m_AnimatedTarget);
改完获取Controller的方法之后,暂时没发现报错。