Files
Colosseum/Assets/Scripts/Player/PlayerAnimationController.cs

99 lines
2.9 KiB
C#

using UnityEngine;
using Unity.Netcode;
namespace Colosseum.Player
{
/// <summary>
/// 플레이어 애니메이션 컨트롤러
/// 이동 속도에 따라 Idle/Walk/Run 애니메이션 제어
/// </summary>
[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<Animator>();
playerMovement = GetComponent<PlayerMovement>();
characterController = GetComponent<CharacterController>();
}
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;
}
/// <summary>
/// 점프 애니메이션 트리거 (외부에서 호출)
/// </summary>
public void PlayJump()
{
if (IsOwner)
{
isJumpingAnimation = true;
animator.SetTrigger(jumpTriggerParam);
}
}
/// <summary>
/// 착지 애니메이션 트리거
/// </summary>
private void PlayLand()
{
isJumpingAnimation = false;
animator.SetTrigger(landTriggerParam);
}
}
}