protected override void OnPlayBack(PlayerEntity player)
        {
            try
            {
                _info.BeginProfileOnlyEnableProfile();

                CheckPlayerLifeState(player);

                var networkAnimator = player.networkAnimator;
                if (null == networkAnimator)
                {
                    return;
                }
                if (!player.gamePlay.IsLifeState(EPlayerLifeState.Dead))
                {
                    OverridePlayBackNetworkAnimator(player, networkAnimator.AnimatorLayers);

                    PoseReplayer.ReplayPose(networkAnimator.AnimatorLayers, networkAnimator.AnimatorParameters,
                                            player.thirdPersonAnimator.UnityAnimator);
                }
            }
            finally
            {
                _info.EndProfileOnlyEnableProfile();
            }
        }
        /// <summary>
        /// 这个函数没有应用PeekDegree等boneRigging.Update
        /// </summary>
        /// <param name="player"></param>
        public static void UpdateAnimatorTransform(PlayerEntity player)
        {
            if (!player.hasNetworkAnimator && !player.hasThirdPersonAnimator)
            {
                return;
            }

            var networkAnimator = player.networkAnimator;
            var animatorP3      = player.thirdPersonAnimator.UnityAnimator;
            var previousMode    = animatorP3.cullingMode;

            animatorP3.cullingMode = AnimatorCullingMode.AlwaysAnimate;
            // Animation
            Animator.ClearAnimatorJobContainer();

//            流量优化用
//            if (networkAnimator.AnimatorParameters == null)
//            {
//                networkAnimator.SetAnimatorParamsWithoutChangeData(
//                    NetworkAnimatorUtil.GetAnimatorParams(player.thirdPersonAnimator.UnityAnimator));
//                networkAnimator.ConvertCompressDataToStructureData();
//            }
            AnimatorPoseReplayer.ReplayPose(networkAnimator.AnimatorLayers, networkAnimator.AnimatorParameters,
                                            animatorP3);

            Animator.BatchUpdate();

            animatorP3.cullingMode = previousMode;
        }
        protected override void OnPlayBack(PlayerEntity player)
        {
            try
            {
                _info.BeginProfileOnlyEnableProfile();

                CheckPlayerLifeState(player);

                var networkAnimator = player.networkAnimator;
                if (null == networkAnimator)
                {
                    return;
                }
                if (!player.gamePlay.IsLifeState(EPlayerLifeState.Dead))
                {
                    OverridePlayBackNetworkAnimator(player, networkAnimator.AnimatorLayers);

//                    流量优化用
//                    if (networkAnimator.AnimatorParameters == null)
//                    {
//                        networkAnimator.SetAnimatorParamsWithoutChangeData(
//                            NetworkAnimatorUtil.GetAnimatorParams(player.thirdPersonAnimator.UnityAnimator));
//                        networkAnimator.ConvertCompressDataToStructureData();
//                    }
                    AnimatorPoseReplayer.ReplayPose(networkAnimator.AnimatorLayers, networkAnimator.AnimatorParameters,
                                                    player.thirdPersonAnimator.UnityAnimator);
                }
            }
            finally
            {
                _info.EndProfileOnlyEnableProfile();
            }
        }
        private void RewindNetworkAnimator(IUserCmd cmd, PlayerEntity playerEntity)
        {
            // 预测回滚
            if (playerEntity.fpAnimStatus.NeedRewind)
            {
                _logger.WarnFormat("rewind fpAnimStatus:{0}!!!", playerEntity.entityKey.Value);

                _poseReplayer.ReplayPose(playerEntity.fpAnimStatus.AnimatorLayers,
                                         playerEntity.fpAnimStatus.AnimatorParameters,
                                         playerEntity.firstPersonAnimator.UnityAnimator);

                // if rewind for history not saved, should not update
                if (playerEntity.fpAnimStatus.BaseClientTime != 0)
                {
                    playerEntity.firstPersonAnimator.UnityAnimator.Update(
                        (cmd.ClientTime - playerEntity.networkAnimator.BaseClientTime - cmd.FrameInterval) * 0.001f);
                }
            }

            if (playerEntity.networkAnimator.NeedRewind)
            {
                _logger.WarnFormat("rewind networkAnimator:{0}!!!", playerEntity.entityKey.Value);

                _poseReplayer.ReplayPose(playerEntity.networkAnimator.AnimatorLayers,
                                         playerEntity.networkAnimator.AnimatorParameters,
                                         playerEntity.thirdPersonAnimator.UnityAnimator);

                // if rewind for history not saved, should not update
                if (playerEntity.networkAnimator.BaseClientTime != 0)
                {
                    playerEntity.thirdPersonAnimator.UnityAnimator.Update(
                        (cmd.ClientTime - playerEntity.networkAnimator.BaseClientTime - cmd.FrameInterval) * 0.001f);
                    //_logger.InfoFormat("rewind for history not saved, should not update, seq:{0}, SnapshotId:{1}", cmd.Seq, cmd.SnapshotId);
                }
            }
        }
        public static void UpdateTransform(PlayerEntity player, NetworkAnimatorComponent networkAnimator, PredictedAppearanceComponent appearance, Orientation orientation)
        {
            if (!player.hasAppearanceInterface)
            {
                return;
            }

            //Logger.InfoFormat("replay pose, networkAnimatior:BaseClientTime{0}, server Time:{1}", networkAnimator.BaseClientTime, networkAnimator.BaseServerTime);

            // Animation
            PoseReplayer.ReplayPose(networkAnimator.AnimatorLayers, networkAnimator.AnimatorParameters,
                                    player.thirdPersonAnimator.UnityAnimator);

            // equipment(pan)
            player.appearanceInterface.Appearance.SyncFrom(player.latestAppearance);
            player.appearanceInterface.Appearance.SyncFrom(appearance);
            player.appearanceInterface.Appearance.TryRewind();
            player.characterBoneInterface.CharacterBone.Peek(player.thirdPersonAppearance.PeekDegree);

            CodeRigBoneParam param = new CodeRigBoneParam
            {
                PitchAmplitude         = orientation.Pitch,
                OverlayAnimationWeight = networkAnimator.AnimatorLayers[NetworkAnimatorLayer.PlayerUpperBodyOverlayLayer].Weight,
                PostureWhenOverlay     = player.thirdPersonAppearance.Posture,
                // 预测时,IK不生效
                IKActive       = ActiveIK(player.thirdPersonAppearance.Action, player.thirdPersonAppearance.Posture),
                HeadPitch      = player.characterBone.PitchHeadAngle,
                HeadYaw        = player.characterBone.RotHeadAngle,
                HandPitch      = player.characterBone.PitchHandAngle,
                HeadRotProcess = player.characterBone.HeadRotProcess,
                IsHeadRotCW    = player.characterBone.IsHeadRotCW
            };

            // code controlled pose
            player.characterBoneInterface.CharacterBone.Update(param);

            // 更新包围盒

            if (player.thirdPersonAppearance.NeedUpdateController)
            {
                player.characterControllerInterface.CharacterController.SetCharacterControllerHeight(player.thirdPersonAppearance.CharacterHeight);
                player.characterControllerInterface.CharacterController.SetCharacterControllerCenter(player.thirdPersonAppearance.CharacterCenter);
                player.characterControllerInterface.CharacterController.SetCharacterControllerRadius(player.thirdPersonAppearance.CharacterRadius);
            }

            player.characterContoller.Value.SetCurrentControllerType(ThirdPersonPostureTool.ConvertToPostureInConfig(player.thirdPersonAppearance.Posture));
        }
Exemple #6
0
        public static void UpdateTransform(PlayerEntity player, NetworkAnimatorComponent networkAnimator,
                                           PredictedAppearanceComponent appearance, OrientationComponent orientation)
        {
            if (!player.hasAppearanceInterface)
            {
                return;
            }

            //Logger.InfoFormat("replay pose, networkAnimatior:BaseClientTime{0}, server Time:{1}", networkAnimator.BaseClientTime, networkAnimator.BaseServerTime);

            // Animation
            Animator.ClearAnimatorJobContainer();

            PoseReplayer.ReplayPose(networkAnimator.AnimatorLayers, networkAnimator.AnimatorParameters,
                                    player.thirdPersonAnimator.UnityAnimator);

            Animator.BatchUpdate();
            Animator.ClearAnimatorJobContainer();

            // equipment(pan)
            var appearanceInterface = player.appearanceInterface;

            appearanceInterface.Appearance.SyncLatestFrom(player.latestAppearance);
            appearanceInterface.Appearance.SyncPredictedFrom(appearance);
            appearanceInterface.Appearance.TryRewind();

            var characterBoneInterface       = player.characterBoneInterface;
            var thirdPersonAppearance        = player.thirdPersonAppearance;
            var characterBone                = player.characterBone;
            var characterControllerInterface = player.characterControllerInterface;

            characterBoneInterface.CharacterBone.Peek(thirdPersonAppearance.PeekDegree);
            var param = new CodeRigBoneParam
            {
                PitchAmplitude         = orientation.Pitch,
                OverlayAnimationWeight =
                    networkAnimator.AnimatorLayers[NetworkAnimatorLayer.PlayerUpperBodyOverlayLayer].Weight,
                PostureWhenOverlay = thirdPersonAppearance.Posture,
                // 预测时,IK不生效
                IKActive = ActiveIK(thirdPersonAppearance.Action, thirdPersonAppearance.Posture,
                                    thirdPersonAppearance.NextPosture, thirdPersonAppearance.Movement),
                HeadPitch      = characterBone.PitchHeadAngle,
                HeadYaw        = characterBone.RotHeadAngle,
                HandPitch      = characterBone.PitchHandAngle,
                HeadRotProcess = characterBone.HeadRotProcess,
                WeaponRot      = characterBone.WeaponRot,
                IsProne        = thirdPersonAppearance.Posture == ThirdPersonPosture.Prone,
                IsHeadRotCW    = characterBone.IsHeadRotCW,

                FirstPersonPositionOffset = characterBone.FirstPersonPositionOffset,
                FirstPersonRotationOffset = characterBone.FirstPersonRotationOffset,
                FirstPersonSightOffset    = characterBone.FirstPersonSightOffset
            };

            // code controlled pose
            characterBoneInterface.CharacterBone.WeaponRotPlayback(param);
            characterBoneInterface.CharacterBone.Update(param);

            player.characterContoller.Value.SetCurrentControllerType(
                ThirdPersonPostureTool.ConvertToPostureInConfig(thirdPersonAppearance.Posture));

            // 更新包围盒

            if (thirdPersonAppearance.NeedUpdateController)
            {
                characterControllerInterface.CharacterController.SetCharacterControllerHeight(thirdPersonAppearance
                                                                                              .CharacterHeight, player.characterContoller.Value.GetCurrentControllerType() == CharacterControllerType.UnityCharacterController, thirdPersonAppearance.CharacterStandHeight);
                characterControllerInterface.CharacterController.SetCharacterControllerCenter(thirdPersonAppearance
                                                                                              .CharacterCenter, player.characterContoller.Value.GetCurrentControllerType() == CharacterControllerType.UnityCharacterController);
                characterControllerInterface.CharacterController.SetCharacterControllerRadius(thirdPersonAppearance
                                                                                              .CharacterRadius, player.characterContoller.Value.GetCurrentControllerType() == CharacterControllerType.UnityCharacterController);
            }
        }
        public static void UpdateTransform(PlayerEntity player, NetworkAnimatorComponent networkAnimator,
                                           PredictedAppearanceComponent appearance, OrientationComponent orientation)
        {
            if (!player.hasAppearanceInterface)
            {
                return;
            }

            // Animation
            Animator.ClearAnimatorJobContainer();

//            流量优化用
//            if (networkAnimator.AnimatorParameters == null)
//            {
//                networkAnimator.SetAnimatorParamsWithoutChangeData(
//                    NetworkAnimatorUtil.GetAnimatorParams(player.thirdPersonAnimator.UnityAnimator));
//                networkAnimator.ConvertCompressDataToStructureData();
//            }
            AnimatorPoseReplayer.ReplayPose(networkAnimator.AnimatorLayers, networkAnimator.AnimatorParameters,
                                            player.thirdPersonAnimator.UnityAnimator);

            Animator.BatchUpdate();

            // equipment(pan)
            var appearanceInterface = player.appearanceInterface;

            appearanceInterface.Appearance.SyncLatestFrom(player.latestAppearance);
            appearanceInterface.Appearance.SyncPredictedFrom(appearance);
            appearanceInterface.Appearance.TryRewind();

            var characterBoneInterface       = player.characterBoneInterface;
            var thirdPersonAppearance        = player.thirdPersonAppearance;
            var characterBone                = player.characterBone;
            var characterControllerInterface = player.characterControllerInterface;

            characterBoneInterface.CharacterBone.Peek(thirdPersonAppearance.PeekDegree);
            var param = new CodeRigBoneParam
            {
                PitchAmplitude         = orientation.Pitch,
                OverlayAnimationWeight =
                    networkAnimator.AnimatorLayers[NetworkAnimatorLayer.PlayerUpperBodyOverlayLayer].Weight,
                PostureWhenOverlay = thirdPersonAppearance.Posture,
                // 预测时,IK不生效
                IKActive = ActiveIK(thirdPersonAppearance.Action, thirdPersonAppearance.Posture,
                                    thirdPersonAppearance.NextPosture, thirdPersonAppearance.Movement),
                HeadPitch        = characterBone.PitchHeadAngle,
                HeadYaw          = characterBone.RotHeadAngle,
                CurrentHandPitch = characterBone.CurrentPitchHandAngle,
                WeaponRot        = characterBone.WeaponRot,

                FirstPersonPositionOffset = characterBone.FirstPersonPositionOffset,
                FirstPersonRotationOffset = characterBone.FirstPersonRotationOffset,
                FirstPersonSightOffset    = characterBone.FirstPersonSightOffset
            };

            // code controlled pose
            characterBoneInterface.CharacterBone.WeaponRotPlayback(param);
            characterBoneInterface.CharacterBone.Update(param);

            player.characterContoller.Value.SetCurrentControllerType(
                ThirdPersonPostureTool.ConvertToPostureInConfig(thirdPersonAppearance.Posture));

            // 更新包围盒

            if (thirdPersonAppearance.NeedUpdateController)
            {
                characterControllerInterface.CharacterController.SetCharacterControllerHeight(thirdPersonAppearance
                                                                                              .CharacterHeight, player.characterContoller.Value.GetCurrentControllerType() == CharacterControllerType.UnityCharacterController, thirdPersonAppearance.CharacterStandHeight);
                characterControllerInterface.CharacterController.SetCharacterControllerCenter(thirdPersonAppearance
                                                                                              .CharacterCenter, player.characterContoller.Value.GetCurrentControllerType() == CharacterControllerType.UnityCharacterController);
                characterControllerInterface.CharacterController.SetCharacterControllerRadius(thirdPersonAppearance
                                                                                              .CharacterRadius, player.characterContoller.Value.GetCurrentControllerType() == CharacterControllerType.UnityCharacterController);
            }
        }