/// <summary>
        /// 直接修改NetworkAnimator的动画数据
        /// </summary>
        private void OverridePlayBackNetworkAnimator(PlayerEntity player,
                                                     List <NetworkAnimatorLayer> networkAnimatorAnimatorLayers)
        {
            var currentTime = _context.session.currentTimeObject.CurrentTime;

            //覆盖受伤动画
            if (player.hasOverrideNetworkAnimator && player.overrideNetworkAnimator.IsInjuryAnimatorActive)
            {
                var normalizeTime = (currentTime - player.overrideNetworkAnimator.InjuryTriigerTime) * 0.001f /
                                    AnimatorParametersHash.InjureyStateDuration;
                _logger.DebugFormat("player:{0}, normalizeTime:{1}, trigger time:{2} ,current time:{3}",
                                    player.entityKey.Value, normalizeTime, player.overrideNetworkAnimator.InjuryTriigerTime,
                                    _context.session.currentTimeObject.CurrentTime);
                if (normalizeTime < 0)
                {
                    _logger.DebugFormat("trigger time:{0} is lager than currentTime:{1}",
                                        player.overrideNetworkAnimator.InjuryTriigerTime, currentTime);
                }
                else if (normalizeTime < 1 && normalizeTime >= 0)
                {
                    NetworkAnimatorUtil.ForceToInjureState(networkAnimatorAnimatorLayers, normalizeTime);
                }
                else
                {
                    player.overrideNetworkAnimator.IsInjuryAnimatorActive = false;
                    player.overrideNetworkAnimator.InjuryTriigerTime      = -1;
                }
            }
        }
        private void WriteNetworkAnimation(IUserCmd cmd, PlayerEntity playerEntity)
        {
            try
            {
                SingletonManager.Get <DurationHelp>().ProfileStart(CustomProfilerStep.StateWriteAnimation);
                // 更新动画播放进度,按需写入数据
                AnimatorChange(NetworkAnimatorUtil.GetAnimatorLayers(playerEntity.firstPersonAnimator.UnityAnimator,
                                                                     playerEntity.fpAnimStatus.AnimatorLayers,
                                                                     _fsmOutputs.AnimatorP1ChangedTrigger()), playerEntity.fpAnimStatus, cmd);

                AnimatorChange(NetworkAnimatorUtil.GetAnimatorLayers(playerEntity.thirdPersonAnimator.UnityAnimator,
                                                                     playerEntity.networkAnimator.AnimatorLayers,
                                                                     _fsmOutputs.AnimatorP3ChangedTrigger()), playerEntity.networkAnimator, cmd);
            }
            finally
            {
                SingletonManager.Get <DurationHelp>().ProfileEnd(CustomProfilerStep.StateWriteAnimation);
            }
        }
        private void WriteNetworkAnimation(IUserCmd cmd, PlayerEntity playerEntity)
        {
            try
            {
                SingletonManager.Get <DurationHelp>().ProfileStart(CustomProfilerStep.StateWriteAnimation);

                NetworkAnimatorUtil.GetAnimatorLayers(playerEntity.firstPersonAnimator.UnityAnimator,
                                                      playerEntity.fpAnimStatus.AnimatorLayers);
                AnimatorChange(playerEntity.fpAnimStatus, cmd);
//                流量优化用
//                playerEntity.fpAnimStatus.ConvertStructureDataToCompressData();

                NetworkAnimatorUtil.GetAnimatorLayers(playerEntity.thirdPersonAnimator.UnityAnimator,
                                                      playerEntity.networkAnimator.AnimatorLayers);
                AnimatorChange(playerEntity.networkAnimator, cmd);
//                流量优化用
//                playerEntity.networkAnimator.ConvertStructureDataToCompressData();
            }
            finally
            {
                SingletonManager.Get <DurationHelp>().ProfileEnd(CustomProfilerStep.StateWriteAnimation);
            }
        }
Example #4
0
        public void OnLoadSucc(PlayerEntity player, UnityObject unityObj)
        {
            GameObject go = unityObj;

            HandleLoadedModel(player, go);

            if (player.hasFirstPersonModel)
            {
                _assetManager.Recycle(player.firstPersonModel.UnityObjectValue);
                player.RemoveAsset(player.firstPersonModel.UnityObjectValue);
            }

            player.ReplaceFirstPersonModel(go, unityObj);

            player.AddAsset(unityObj);

            player.appearanceInterface.FirstPersonAppearance =
                new FirstPersonAppearanceManager(player.firstPersonAppearance);

            go.name = "P1_" + player.entityKey;
            go.transform.SetParent(player.RootGo().transform);
            go.transform.localPosition = new Vector3(0, player.firstPersonAppearance.FirstPersonHeight,
                                                     player.firstPersonAppearance.FirstPersonForwardOffset);
            go.transform.localRotation = Quaternion.identity;
            go.transform.localScale    = Vector3.one;
            Logger.InfoFormat("P1 loaded: {0}", player.entityKey);

            player.ReplaceFirstPersonAnimator(go.GetComponent <Animator>());

            var ik = go.AddComponent <PlayerIK>();

            ik.SetAnimator(AvatarIKGoal.LeftHand, player.firstPersonAnimator.UnityAnimator);
            ik.SetIKLayer(AvatarIKGoal.LeftHand, NetworkAnimatorLayer.FirstPersonIKPassLayer);
            ik.SetAnimator(AvatarIKGoal.RightHand, player.firstPersonAnimator.UnityAnimator);
            ik.SetIKLayer(AvatarIKGoal.RightHand, NetworkAnimatorLayer.FirstPersonIKPassLayer);

            BoneTool.CacheTransform(go);

            if (player.isFlagSelf)
            {
                var animationEvent = go.AddComponent <AnimationClipEvent>();
                animationEvent.Player = player;
                player.animatorClip.ClipManager.SetAnimationCleanEventCallback(animationEvent
                                                                               .InterruptAnimationEventFunc);
            }
            else
            {
                go.AddComponent <ThirdPersonAnimationClipEvent>();
            }

            player.firstPersonAnimator.UnityAnimator.Update(0);

            player.appearanceInterface.Appearance.SetFirstPersonCharacter(go);
            player.appearanceInterface.FirstPersonAppearance.SetFirstPersonCharacter(go);

            player.appearanceInterface.Appearance.SetAnimatorP1(player.firstPersonAnimator.UnityAnimator);

            player.stateInterface.State.SetName(player.RootGo().name);

            player.characterBoneInterface.CharacterBone.SetFirstPersonCharacter(go);

            player.ReplaceFpAnimStatus(
                NetworkAnimatorUtil.CreateAnimatorLayers(player.firstPersonAnimator.UnityAnimator),
                NetworkAnimatorUtil.GetAnimatorParams(player.firstPersonAnimator.UnityAnimator));

            // 禁用非可见状态下的动画更新
            if (!player.isFlagSelf)
            {
                player.firstPersonAnimator.UnityAnimator.cullingMode = AnimatorCullingMode.CullUpdateTransforms;
            }
            else
            {
                player.firstPersonAnimator.UnityAnimator.cullingMode = AnimatorCullingMode.AlwaysAnimate;
            }
        }
Example #5
0
        public void OnLoadSucc(PlayerEntity player, UnityObject unityObj)
        {
            if (null == unityObj || null == unityObj.AsGameObject)
            {
                Logger.ErrorFormat("CharacterLog-- playerEntity:  {0}  unityObj is Null", player.entityKey);
            }

            GameObject go = unityObj;

            if (player.hasThirdPersonModel)
            {
                _assetManager.Recycle(player.thirdPersonModel.UnityObjectValue);
                player.RemoveAsset(player.thirdPersonModel.UnityObjectValue);
            }

            player.ReplaceThirdPersonModel(go, unityObj);

            var provider = SingletonManager.Get <HitBoxTransformProviderCache>()
                           .GetProvider(player.thirdPersonModel.Value);

            HitBoxComponentUtility.InitHitBoxComponent(player.entityKey.Value, player, provider);

            RemoveRagdollOnServerSide(go, provider.GetHitBoxColliders().Values.ToList());

            HandleLoadedModel(player, go);

            InitCharacterControllerSetting(player);

            player.AddAsset(unityObj);

            go.name = go.name.Replace("(Clone)", "");

            go.transform.SetParent(GetThirdModelParent(player.RootGo().transform));
            go.transform.localPosition = new Vector3(0, 0, 0);
            go.transform.localRotation = Quaternion.identity;
            go.transform.localScale    = Vector3.one;
            Logger.InfoFormat("CharacterLog-- P3 loaded: {0}", player.entityKey);

            BoneTool.CacheTransform(go);

            player.ReplaceBones(null, null, null);

            player.bones.Head  = BoneMount.FindChildBoneFromCache(go, BoneName.CharacterHeadBoneName);
            player.bones.Spine = BoneMount.FindChildBoneFromCache(go, BoneName.CharacterSpineName);

            player.ReplaceThirdPersonAnimator(go.GetComponent <Animator>());

            if (player.hasFsmInputRelateInterface)
            {
                player.fsmInputRelateInterface.Relate.InitLimit();
                player.fsmInputRelateInterface.Relate.CreateAllLimitFsmInput(player.thirdPersonAnimator.UnityAnimator);
            }

            var ik = go.AddComponent <PlayerIK>();

            ik.SetAnimator(AvatarIKGoal.LeftHand, player.thirdPersonAnimator.UnityAnimator);
            ik.SetIKLayer(AvatarIKGoal.LeftHand, NetworkAnimatorLayer.ThirdPersonIKPassLayer);
            ik.SetAnimator(AvatarIKGoal.RightHand, player.thirdPersonAnimator.UnityAnimator);
            ik.SetIKLayer(AvatarIKGoal.RightHand, NetworkAnimatorLayer.ThirdPersonIKPassLayer);

            if (player.isFlagSelf)
            {
                var animationEvent = go.AddComponent <AnimationClipEvent>();
                animationEvent.Player = player;
                player.animatorClip.ClipManager.SetAnimationCleanEventCallback(animationEvent
                                                                               .InterruptAnimationEventFunc);
            }
            else
            {
                go.AddComponent <ThirdPersonAnimationClipEvent>();
            }

            // 设置大厅传入的roleId和avatarId
            player.appearanceInterface.Appearance.SetRoleModelIdAndInitAvatar(player.playerInfo.RoleModelId,
                                                                              player.playerInfo.AvatarIds);

            player.characterControllerInterface.CharacterController.SetCharacterRoot(player.characterContoller.Value
                                                                                     .gameObject);
            player.appearanceInterface.Appearance.SetRootGo(player.RootGo());
            player.appearanceInterface.Appearance.SetThirdPersonCharacter(go);
            player.appearanceInterface.Appearance.SetRagDollComponent(player.ragDoll);
            player.characterControllerInterface.CharacterController.SetThirdModel(player.thirdPersonModel.Value);

            player.characterBoneInterface.CharacterBone.SetCharacterRoot(player.characterContoller.Value
                                                                         .gameObject);
            player.characterBoneInterface.CharacterBone.SetThirdPersonCharacter(go);
            ForceCrouch(player.thirdPersonAnimator.UnityAnimator);
            player.characterBoneInterface.CharacterBone.SetStableCrouchPelvisRotation();
            ForceStand(player.thirdPersonAnimator.UnityAnimator);
            player.characterBoneInterface.CharacterBone.SetStableStandPelvisRotation();

            player.appearanceInterface.Appearance.SetAnimatorP3(player.thirdPersonAnimator.UnityAnimator);

            player.appearanceInterface.Appearance.PlayerReborn();
            player.characterControllerInterface.CharacterController.PlayerReborn();
            if (player.hasStateInterface)
            {
                player.stateInterface.State.PlayerReborn();
            }
            if (player.hasPlayerInfo)
            {
                player.playerInfo.InitTransform();
            }

            player.ReplaceNetworkAnimator(
                NetworkAnimatorUtil.CreateAnimatorLayers(player.thirdPersonAnimator.UnityAnimator),
                NetworkAnimatorUtil.GetAnimatorParams(player.thirdPersonAnimator.UnityAnimator));

            player.networkAnimator.SetEntityName(player.entityKey.ToString());

            player.ReplaceOverrideNetworkAnimator();

            if (SharedConfig.IsServer)
            {
                player.ReplaceNetworkAnimatiorServerTime(0);
            }

            // 禁用非可见状态下的动画更新,在获取Stable状态之后
            if (SharedConfig.IsServer || !player.isFlagSelf)
            {
                player.thirdPersonAnimator.UnityAnimator.cullingMode = AnimatorCullingMode.CullUpdateTransforms;
            }
            else
            {
                player.thirdPersonAnimator.UnityAnimator.cullingMode = AnimatorCullingMode.AlwaysAnimate;
            }

            //人物变身、换肤时,清空特效数据
            if (player.hasEffects)
            {
                player.effects.ResetEffects();
            }

            // 处理显隐
            if (player.hasGamePlay)
            {
                PlayerEntityUtility.SetVisibility(go, player.gamePlay.Visibility);
            }
        }
        public void Init(IEntity entity, AssetStatus status)
        {
            var player = entity as PlayerEntity;
            var obj    = status.Object.AsGameObject;

            obj.layer = UnityLayerManager.GetLayerIndex(EUnityLayerName.Player);
            PlayerEntityUtility.DisableCollider(obj.transform);
            var go = obj;


            player.AddFirstPersonModel(go);

            player.appearanceInterface.FirstPersonAppearance = new FirstPersonAppearanceManager(player.firstPersonAppearance);

            go.name = "P1_" + player.entityKey;
            go.transform.SetParent(player.playerResource.Root.transform);
            go.transform.localPosition = new Vector3(0, player.firstPersonAppearance.FirstPersonHeight, player.firstPersonAppearance.FirstPersonForwardOffset);
            go.transform.localRotation = Quaternion.identity;
            go.transform.localScale    = Vector3.one;
            Logger.InfoFormat("P1 loaded: {0}", player.entityKey);

            player.AddFirstPersonAnimator(go.GetComponent <Animator>());

            var ik = go.AddComponent <PlayerIK>();

            ik.SetAnimator(AvatarIKGoal.LeftHand, player.firstPersonAnimator.UnityAnimator);
            ik.SetIKLayer(AvatarIKGoal.LeftHand, NetworkAnimatorLayer.FirstPersonIKPassLayer);
            ik.SetAnimator(AvatarIKGoal.RightHand, player.firstPersonAnimator.UnityAnimator);
            ik.SetIKLayer(AvatarIKGoal.RightHand, NetworkAnimatorLayer.FirstPersonIKPassLayer);


            BoneTool.CacheTransform(go);

            if (player.isFlagSelf)
            {
                var animationEvent = go.AddComponent <AnimationClipEvent>();
                animationEvent.Player = player;
                player.animatorClip.ClipManager.SetAnimationCleanEventCallback(animationEvent.InterruptAnimationEventFunc);
            }
            else
            {
                go.AddComponent <ThirdPersonAnimationClipEvent>();
            }

            player.firstPersonAnimator.UnityAnimator.Update(0);

            player.appearanceInterface.Appearance.SetFirstPersonCharacter(go);
            player.appearanceInterface.FirstPersonAppearance.SetFirstPersonCharacter(go);

            player.appearanceInterface.Appearance.SetAnimatorP1(player.firstPersonAnimator.UnityAnimator);

            player.stateInterface.State.SetName(player.RootGo().name);

            player.characterBoneInterface.CharacterBone.SetFirstPersonCharacter(go);

            if (!player.hasFpAnimStatus)
            {
                player.AddFpAnimStatus(NetworkAnimatorUtil.CreateAnimatorLayers(player.firstPersonAnimator.UnityAnimator),
                                       NetworkAnimatorUtil.GetAnimatorParams(player.firstPersonAnimator.UnityAnimator));
            }

            // 禁用非可见状态下的动画更新
            if (!player.isFlagSelf)
            {
                player.firstPersonAnimator.UnityAnimator.cullingMode = AnimatorCullingMode.CullUpdateTransforms;
            }
            else
            {
                player.firstPersonAnimator.UnityAnimator.cullingMode = AnimatorCullingMode.AlwaysAnimate;
            }
        }
        public void Init(IEntity entity, AssetStatus status)
        {
            var go     = status.Object.AsGameObject;
            var player = entity as PlayerEntity;

            RemoveRagdollOnServerSide(go);


            player.AddThirdPersonModel(go);

            go.name = go.name.Replace("(Clone)", "");
            go.transform.SetParent(player.RootGo().transform);
            go.transform.localPosition = Vector3.zero;
            go.transform.localRotation = Quaternion.identity;
            go.transform.localScale    = Vector3.one;
            _logger.InfoFormat("P3 loaded: {0}", player.entityKey);


            BoneTool.CacheTransform(go);

            if (!player.hasBones)
            {
                player.AddBones(null, null, null);
            }

            player.bones.Head  = BoneMount.FindChildBoneFromCache(go, BoneName.CharacterHeadBoneName);
            player.bones.Spine = BoneMount.FindChildBoneFromCache(go, BoneName.CharacterSpineName);

            player.AddThirdPersonAnimator(go.GetComponent <Animator>());

            var ik = go.AddComponent <PlayerIK>();

            ik.SetAnimator(AvatarIKGoal.LeftHand, player.thirdPersonAnimator.UnityAnimator);
            ik.SetIKLayer(AvatarIKGoal.LeftHand, NetworkAnimatorLayer.ThirdPersonIKPassLayer);
            ik.SetAnimator(AvatarIKGoal.RightHand, player.thirdPersonAnimator.UnityAnimator);
            ik.SetIKLayer(AvatarIKGoal.RightHand, NetworkAnimatorLayer.ThirdPersonIKPassLayer);

            if (player.isFlagSelf)
            {
                var animationEvent = go.AddComponent <AnimationClipEvent>();
                animationEvent.Player = player;
                player.animatorClip.ClipManager.SetAnimationCleanEventCallback(animationEvent.InterruptAnimationEventFunc);
                // 设置大厅传入的roleId和avatarId
                player.appearanceInterface.Appearance.SetRoleModelIdAndInitAvatar(player.playerInfo.RoleModelId, player.playerInfo.AvatarIds);
            }
            else
            {
                go.AddComponent <ThirdPersonAnimationClipEvent>();
            }

            player.characterControllerInterface.CharacterController.SetCharacterRoot(player.characterContoller.Value.gameObject);
            player.appearanceInterface.Appearance.SetThirdPersonCharacter(go);
            player.thirdPersonAnimator.UnityAnimator.Update(0);

            player.characterBoneInterface.CharacterBone.SetCharacterRoot(player.characterContoller.Value.gameObject);
            player.characterBoneInterface.CharacterBone.SetThirdPersonCharacter(go);
            player.characterBoneInterface.CharacterBone.SetStablePelvisRotation();

            player.appearanceInterface.Appearance.SetAnimatorP3(player.thirdPersonAnimator.UnityAnimator);

            player.appearanceInterface.Appearance.PlayerReborn();
            player.characterControllerInterface.CharacterController.PlayerReborn();

            // 实际应该使用SharedConfig.IsServer,但离线模式中其值为false
            if (!player.hasNetworkAnimator)
            {
                player.AddNetworkAnimator(NetworkAnimatorUtil.CreateAnimatorLayers(player.thirdPersonAnimator.UnityAnimator),
                                          NetworkAnimatorUtil.GetAnimatorParams(player.thirdPersonAnimator.UnityAnimator));

                player.networkAnimator.SetEntityName(player.entityKey.ToString());
            }

            if (SharedConfig.IsServer)
            {
                player.AddNetworkAnimatiorServerTime(0);
            }

            // 禁用非可见状态下的动画更新,在获取Stable状态之后
            if (SharedConfig.IsServer || !player.isFlagSelf)
            {
                player.thirdPersonAnimator.UnityAnimator.cullingMode = AnimatorCullingMode.CullUpdateTransforms;
            }
            else
            {
                player.thirdPersonAnimator.UnityAnimator.cullingMode = AnimatorCullingMode.AlwaysAnimate;
            }
        }
Example #8
0
            public void OnLoadSucc(PlayerEntity player, UnityObject unityObj)
            {
                GameObject go = unityObj;

                player.AddThirdPersonModel(go);

                var provider = SingletonManager.Get <HitBoxTransformProviderCache>()
                               .GetProvider(player.thirdPersonModel.Value);

                HitBoxComponentUtility.InitHitBoxComponent(player.entityKey.Value, player, provider);

                RemoveRagdollOnServerSide(go, provider.GetHitBoxColliders().Values.ToList());

                HandleLoadedModel(player, go);

                player.AddAsset(unityObj);

                go.name = go.name.Replace("(Clone)", "");
                go.transform.SetParent(player.RootGo().transform);
                go.transform.localPosition = new Vector3(0, -PlayerEntityUtility.CcSkinWidth, 0);
                go.transform.localRotation = Quaternion.identity;
                go.transform.localScale    = Vector3.one;
                _logger.InfoFormat("P3 loaded: {0}", player.entityKey);

                BoneTool.CacheTransform(go);

                if (!player.hasBones)
                {
                    player.AddBones(null, null, null);
                }

                player.bones.Head  = BoneMount.FindChildBoneFromCache(go, BoneName.CharacterHeadBoneName);
                player.bones.Spine = BoneMount.FindChildBoneFromCache(go, BoneName.CharacterSpineName);

                player.AddThirdPersonAnimator(go.GetComponent <Animator>());

                var ik = go.AddComponent <PlayerIK>();

                ik.SetAnimator(AvatarIKGoal.LeftHand, player.thirdPersonAnimator.UnityAnimator);
                ik.SetIKLayer(AvatarIKGoal.LeftHand, NetworkAnimatorLayer.ThirdPersonIKPassLayer);
                ik.SetAnimator(AvatarIKGoal.RightHand, player.thirdPersonAnimator.UnityAnimator);
                ik.SetIKLayer(AvatarIKGoal.RightHand, NetworkAnimatorLayer.ThirdPersonIKPassLayer);

                if (player.isFlagSelf)
                {
                    var animationEvent = go.AddComponent <AnimationClipEvent>();
                    animationEvent.Player = player;
                    player.animatorClip.ClipManager.SetAnimationCleanEventCallback(animationEvent.InterruptAnimationEventFunc);
                }
                else
                {
                    go.AddComponent <ThirdPersonAnimationClipEvent>();
                }

                // 设置大厅传入的roleId和avatarId
                player.appearanceInterface.Appearance.SetRoleModelIdAndInitAvatar(player.playerInfo.RoleModelId, player.playerInfo.AvatarIds);

                player.characterControllerInterface.CharacterController.SetCharacterRoot(player.characterContoller.Value.gameObject);
                player.appearanceInterface.Appearance.SetThirdPersonCharacter(go);
                player.thirdPersonAnimator.UnityAnimator.Update(0);
                player.characterControllerInterface.CharacterController.SetThirdModel(player.thirdPersonModel.Value);

                player.characterBoneInterface.CharacterBone.SetCharacterRoot(player.characterContoller.Value.gameObject);
                player.characterBoneInterface.CharacterBone.SetThirdPersonCharacter(go);
                player.characterBoneInterface.CharacterBone.SetStablePelvisRotation();

                player.appearanceInterface.Appearance.SetAnimatorP3(player.thirdPersonAnimator.UnityAnimator);

                player.appearanceInterface.Appearance.PlayerReborn();
                player.characterControllerInterface.CharacterController.PlayerReborn();

                // 实际应该使用SharedConfig.IsServer,但离线模式中其值为false
                if (!player.hasNetworkAnimator)
                {
                    player.AddNetworkAnimator(NetworkAnimatorUtil.CreateAnimatorLayers(player.thirdPersonAnimator.UnityAnimator),
                                              NetworkAnimatorUtil.GetAnimatorParams(player.thirdPersonAnimator.UnityAnimator));

                    player.networkAnimator.SetEntityName(player.entityKey.ToString());
                }

                if (!player.hasOverrideNetworkAnimator)
                {
                    player.AddOverrideNetworkAnimator();
                }

                if (SharedConfig.IsServer)
                {
                    player.AddNetworkAnimatiorServerTime(0);
                }

                // 禁用非可见状态下的动画更新,在获取Stable状态之后
                if (SharedConfig.IsServer || !player.isFlagSelf)
                {
                    player.thirdPersonAnimator.UnityAnimator.cullingMode = AnimatorCullingMode.CullUpdateTransforms;
                }
                else
                {
                    player.thirdPersonAnimator.UnityAnimator.cullingMode = AnimatorCullingMode.AlwaysAnimate;
                }

//                _assetManager.LoadAssetAsync(player, AssetConfig.GetCharacterHitboxAssetInfo(player.playerInfo.ModelName), new HitboxLoadResponseHandler().OnLoadSucc);
            }