using System; using KINEMATION.MagicBlend.Runtime; using NBC; using UnityEngine; namespace NBF { public class PlayerAnimator : MonoBehaviour { public Animator _Animator; public FPlayer Player { get; private set; } private bool _isTorsoLayerEnabled; private bool _isInit; private PlayerIK _IK; private MagicBlending _magicBlending; #region 参数定义 public static readonly int IsSwiming = Animator.StringToHash("Swim"); public static readonly int ThrowFar = Animator.StringToHash("ThrowFar"); public static readonly int BoatDriving = Animator.StringToHash("BoatDriving"); public static readonly int BaitInWater = Animator.StringToHash("BaitInWater"); public static readonly int HeldRod = Animator.StringToHash("HeldRod"); public static readonly int RodArming = Animator.StringToHash("RodArming"); public static readonly int Forward = Animator.StringToHash("Forward"); public static readonly int Turn = Animator.StringToHash("Turn"); public static readonly int OnGround = Animator.StringToHash("OnGround"); public static readonly int RodRight = Animator.StringToHash("rod right"); public static readonly int RodForward = Animator.StringToHash("rod forward"); public static readonly int PreciseCast = Animator.StringToHash("Precise Cast"); public static readonly int PreciseIdle = Animator.StringToHash("Precise Idle"); public static readonly string Torso = "Torso"; #endregion private void Awake() { Player = GetComponentInParent(); _magicBlending = GetComponent(); _Animator = GetComponent(); _Animator.keepAnimatorStateOnDisable = true; _IK = GetComponent(); _isInit = true; // Player.Data.OnStateChange += PlayerFSMState_OnValueChanged; } private void OnDestroy() { // Player.Data.OnStateChange += PlayerFSMState_OnValueChanged; } // private void OnEnable() // { // playerFSMState.OnValueChanged += PlayerFSMState_OnValueChanged; // } // // private void OnDisable() // { // playerFSMState.OnValueChanged -= PlayerFSMState_OnValueChanged; // } // private void OnFishingSetUnequip() // { // _isTorsoLayerEnabled = false; // _IK.SetBipedLeftHandIK(enabled: false, null); // } // // private void OnCastLure() // { // playerFSMState.Value = PlayerState.baitFlies; // SFXGameManagement.PlaySound("Cast Fishing Rod", base.transform); // } // // private void OnBailUnnarm() // { // if (IsThrowButtonPressed.Value) // { // _Animator.SetBool(ThrowFar, value: true); // playerFSMState.Value = PlayerState.casting; // OnBailOpen?.Invoke(); // } // } // // private void OnFishingSetEquiped_OnRaised(FishingSetController set) // { // _isTorsoLayerEnabled = true; // _IK.SetBipedLeftHandIK(enabled: false, set.AttachedReel.FingersIKAnchor); // } // // private void PlayAnimation(string state, string layer) // { // _Animator.CrossFade(state, 0.3f, _Animator.GetLayerIndex(layer)); // } // // public void PlayPreciseCastAnimation() // { // _Animator.SetBool(PreciseIdle, value: false); // _Animator.SetTrigger(PreciseCast); // } // // public void SetLayerWeight(string layer, float weight) // { // _Animator.SetLayerWeight(_Animator.GetLayerIndex(layer), weight); // } // // private void PlayerFSMState_OnValueChanged(PlayerState state) // { // switch (playerFSMState.PreviousValue) // { // case PlayerState.vehicle: // _IsInVehicle = false; // _Animator.SetBool(BoatDriving, value: false); // break; // case PlayerState.swiming: // _Animator.SetBool(IsSwiming, value: false); // break; // case PlayerState.preciseCastIdle: // _Animator.SetBool(PreciseIdle, value: false); // break; // case PlayerState.prepare: // _Animator.SetBool(RodArming, value: false); // break; // case PlayerState.casting: // _Animator.SetBool(ThrowFar, value: false); // break; // case PlayerState.collectFish: // _magicBlending.BlendAsset.globalWeight = 0f; // break; // } // // switch (state) // { // case PlayerState.idle: // case PlayerState.move: // _Animator.SetBool(BaitInWater, value: false); // _Animator.SetBool(HeldRod, value: false); // _Animator.SetBool(ThrowFar, value: false); // _Animator.SetBool(RodArming, value: false); // break; // case PlayerState.prepare: // _Animator.SetBool(RodArming, value: true); // _Animator.SetBool(HeldRod, value: true); // break; // case PlayerState.fishing: // _Animator.SetBool(HeldRod, value: true); // _Animator.SetBool(BaitInWater, value: true); // break; // case PlayerState.vehicle: // _Animator.SetBool(BaitInWater, value: false); // _Animator.SetBool(HeldRod, value: false); // _Animator.SetBool(ThrowFar, value: false); // _Animator.SetBool(RodArming, value: false); // _Animator.SetBool(BoatDriving, value: true); // _IK.SetBipedLeftHandIK(enabled: true); // _IsInVehicle = true; // break; // case PlayerState.vehicleFishing: // _Animator.SetBool(BaitInWater, value: false); // _Animator.SetBool(HeldRod, value: false); // _Animator.SetBool(ThrowFar, value: false); // _Animator.SetBool(RodArming, value: false); // _IsInVehicle = true; // break; // case PlayerState.swiming: // _Animator.SetBool(IsSwiming, value: true); // break; // case PlayerState.collectFish: // _Animator.SetBool(BaitInWater, value: false); // _IK.SetAimIK(enabled: false); // _magicBlending.BlendAsset.globalWeight = 1f; // break; // case PlayerState.preciseCastIdle: // _Animator.SetBool(PreciseIdle, value: true); // break; // case PlayerState.casting: // case PlayerState.baitFlies: // case PlayerState.fight: // case PlayerState.fishView: // case PlayerState.throwFish: // case PlayerState.flyModeDebug: // break; // } // } // // private void LateUpdate() // { // if (playerFSMState.Value == PlayerState.swiming) // { // float value = Mathf.Lerp(_Animator.GetFloat(Forward), currentMoveSpeed.Value / 2.5f, // Time.deltaTime * 5f); // float value2 = Mathf.Lerp(_Animator.GetFloat(Turn), RotationSpeed.Value, Time.deltaTime * 5f); // _Animator.SetFloat(Forward, Mathf.Clamp01(value)); // _Animator.SetFloat(Turn, Mathf.Clamp(value2, -1f, 1f)); // } // else // { // float value3 = Mathf.Lerp(_Animator.GetFloat(Forward), currentMoveSpeed.Value / 5f, // Time.deltaTime * 20f); // float value4 = Mathf.Lerp(_Animator.GetFloat(Turn), RotationSpeed.Value, Time.deltaTime * 15f); // _Animator.SetFloat(Forward, Mathf.Clamp01(value3)); // _Animator.SetFloat(Turn, Mathf.Clamp(value4, -1f, 1f)); // } // // _Animator.SetBool(OnGround, _IsInVehicle || isGrounded.Value); // _Animator.SetFloat(RodRight, rodPosition.Value.x); // _Animator.SetFloat(RodForward, rodPosition.Value.y); // float layerWeight = _Animator.GetLayerWeight(_Animator.GetLayerIndex("Torso")); // SetLayerWeight("Torso", // Mathf.MoveTowards(layerWeight, _isTorsoLayerEnabled ? 1f : 0f, Time.deltaTime * 3f)); // } // private void LateUpdate() // { // if (!_isInit) return; // UpdateAnimator(); // } // // // private void UpdateAnimator() // { // Animator.SetBool(OnGround, Player.Data.IsGrounded); // float value3 = Mathf.Lerp(Animator.GetFloat(Forward), Player.Data.Speed / 5f, Time.deltaTime * 20f); // Animator.SetFloat(Forward, value3); // // // 平滑处理 // // float smoothedTurn = Mathf.SmoothDamp(Animator.GetFloat(Turn), // // MapUnit.RotationSpeed, // // ref turnSmoothVelocity, // // smoothingTime // // ); // // float smoothedTurn = Mathf.Lerp(Animator.GetFloat(Turn), Player.Data.RotationSpeed, Time.deltaTime * 10f); // Animator.SetFloat(Turn, smoothedTurn); // // // float layerWeight = Animator.GetLayerWeight(Animator.GetLayerIndex(Torso)); // SetLayerWeight(Torso, // Mathf.MoveTowards(layerWeight, _isTorsoLayerEnabled ? 1f : 0f, Time.deltaTime * 3f)); // } // // public void SetLayerWeight(string layer, float weight) // { // Animator.SetLayerWeight(Animator.GetLayerIndex(layer), weight); // } } }