using UnityEngine; public class NPCController : MonoBehaviour { private Animator _anim; [SerializeField] private int _defaultAnimNo; private static readonly int _speedHash = Animator.StringToHash("Speed"); private Vector3 _lastPosition; private float _smoothedSpeed; private void Awake() { _anim = GetComponent(); } private void OnEnable() { _lastPosition = transform.position; _smoothedSpeed = 0f; } public void SetAnimState(int animNo) { _anim.SetFloat("AnimNo", (float)animNo); } public void SetDefaultAnimState() { SetAnimState(_defaultAnimNo); } // 이동 속도를 재서 Animator의 "Speed" 파라미터로 넘긴다 (블렌드 트리용). // 속도는 위치 변화량으로 직접 잰다 — Rigidbody가 있어도 kinematic + 트랜스폼 직접 이동(타임라인)은 // 물리를 안 거쳐서 linearVelocity가 항상 0이기 때문. 타임라인이 위치를 쓴 뒤인 LateUpdate에서 잰다. private void LateUpdate() { if (Time.deltaTime <= 0f) return; // 수평 이동 속도 (m/s) Vector3 delta = transform.position - _lastPosition; delta.y = 0f; _lastPosition = transform.position; // 프레임 편차로 인한 떨림 방지용 스무딩 _smoothedSpeed = Mathf.Lerp(_smoothedSpeed, delta.magnitude / Time.deltaTime, 10f * Time.deltaTime); _anim.SetFloat(_speedHash, _smoothedSpeed); } }