解决CinemachineStateDrivenCamera用同一个Controller报错问题

版权声明:本文为博主原创文章,未经博主允许不得转载。如果您有更好的想法,请留言 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的方法之后,暂时没发现报错。

猜你喜欢

转载自blog.csdn.net/qq_34552886/article/details/81437033
今日推荐