版权声明:本文为博主原创文章,未经博主允许不得转载。如果您有更好的想法,请留言 https://blog.csdn.net/qq_34552886/article/details/81437033
在做游戏时候,创建了几个不同的人物,但是他们都共用一个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 hell
return 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 states
AnimatorController ac = (Target.m_AnimatedTarget == null)
? null : Target.m_AnimatedTarget.runtimeAnimatorController as AnimatorController;
改为:
private void UpdateTargetStates()
{
// Scrape the Animator Controller for states
AnimatorController ac = (Target.m_AnimatedTarget == null)
? null : CinemachineStateDrivenCamera.GetControllerFromAnimator(Target.m_AnimatedTarget);
改完获取Controller的方法之后,暂时没发现报错。