using UnityEngine; using Unity.Netcode; namespace Colosseum.Player { /// /// 플레이어 애니메이션 컨트롤러 /// 이동 속도에 따라 Idle/Walk/Run 애니메이션 제어 /// [RequireComponent(typeof(Animator))] [RequireComponent(typeof(PlayerMovement))] public class PlayerAnimationController : NetworkBehaviour { [Header("Animation Parameters")] [SerializeField] private string speedParam = "Speed"; [SerializeField] private string isGroundedParam = "IsGrounded"; [SerializeField] private string jumpTriggerParam = "Jump"; [SerializeField] private string landTriggerParam = "Land"; [Header("Settings")] [SerializeField] private float speedSmoothTime = 0.1f; private Animator animator; private PlayerMovement playerMovement; private CharacterController characterController; private float currentSpeed; private float speedVelocity; private bool wasGrounded = true; private bool isJumpingAnimation; private void Awake() { animator = GetComponent(); playerMovement = GetComponent(); characterController = GetComponent(); } public override void OnNetworkSpawn() { if (!IsOwner) { enabled = false; } } private void Update() { if (!IsOwner) return; UpdateAnimationParameters(); } private void UpdateAnimationParameters() { // PlayerMovement에서 직접 속도 가져오기 float targetSpeed = playerMovement.CurrentMoveSpeed; // 부드러운 속도 변화 currentSpeed = Mathf.SmoothDamp(currentSpeed, targetSpeed, ref speedVelocity, speedSmoothTime); // 지면 접촉 상태 bool isGrounded = characterController.isGrounded; // 착지 감지 (공중에서 지면으로) if (!wasGrounded && isGrounded && isJumpingAnimation) { PlayLand(); } // 애니메이터 파라미터 설정 animator.SetFloat(speedParam, currentSpeed); animator.SetBool(isGroundedParam, isGrounded); wasGrounded = isGrounded; } /// /// 점프 애니메이션 트리거 (외부에서 호출) /// public void PlayJump() { if (IsOwner) { isJumpingAnimation = true; animator.SetTrigger(jumpTriggerParam); } } /// /// 착지 애니메이션 트리거 /// private void PlayLand() { isJumpingAnimation = false; animator.SetTrigger(landTriggerParam); } } }