using System; using UnityEngine; using KBCore.Refs; namespace Infrastructure.Unity { [RequireComponent(typeof(Rigidbody))] public class HunterNpcController : MonoBehaviour { [SerializeField] private float moveSpeed = 7f; [SerializeField] private LayerMask tileLayer; [Self] [SerializeField] private Rigidbody rb; private PlayerController _target; private Action _onCaughtCallback; private Func _timeDilationProvider; public void Initialize(PlayerController target, Action onCaughtCallback, Func timeDilationProvider) { _target = target; _onCaughtCallback = onCaughtCallback; _timeDilationProvider = timeDilationProvider; } private void FixedUpdate() { if (!_target) return; var dilation = _timeDilationProvider?.Invoke() ?? 1f; var direction = (_target.transform.position - transform.position).normalized; direction.y = 0; direction.Normalize(); rb.MovePosition(rb.position + direction * (moveSpeed * dilation * Time.fixedDeltaTime)); if (Physics.Raycast(transform.position, Vector3.down, out var hit, 2f, tileLayer)) { if (hit.collider.TryGetComponent(out var tile)) { tile.OnPlayerStep(); } } } private bool IsGrounded() { return Physics.Raycast(transform.position, Vector3.down, out var hit, 2f, tileLayer); } private void OnDrawGizmos() { if (!_target) return; Gizmos.color = Color.red; Gizmos.DrawLine(transform.position, _target.transform.position); } private void OnCollisionEnter(Collision other) { if (!_target) return; if (other.gameObject == _target.gameObject) { _onCaughtCallback?.Invoke(); Destroy(gameObject); } } } }