using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class NPCController : MonoBehaviour { private NavMeshAgent agent; private Animator animator; [Header("External References")] public Animator doorAnimatorExit; public Animator doorAnimatorEnter; public Stamping stamping; public ResumeManager resumeManager; [Header("Scene Points")] public GameObject chairCubeTarget; public GameObject chairCubeSit; public GameObject exitPoint; private GameObject npcTorso; [Header("NPC Data")] [SerializeField] private List allPersons = new List(); private bool isExiting = false; private bool resumeSpawned = false; private void Start() { agent = GetComponent(); animator = GetComponent(); npcTorso = transform.GetChild(1).gameObject; ResetNPCState(); agent.updateRotation = false; doorAnimatorEnter.SetBool("isEntering", true); StartCoroutine(CloseEnterDoorAfterDelay()); MoveToChair(); } private void Update() { if (!agent.pathPending && agent.remainingDistance <= agent.stoppingDistance) { if (isExiting) ReturnToPool(); else TrySitDown(); } } private void MoveToChair() { agent.SetDestination(chairCubeTarget.transform.position); SetAnimationState(walking: true); Debug.Log("NPC moving to chair."); } private void TrySitDown() { agent.Warp(chairCubeSit.transform.position); SetAnimationState(sitting: true); if (!resumeSpawned && allPersons.Count > 0) { int randomIndex = Random.Range(0, allPersons.Count); Person selectedPerson = allPersons[randomIndex]; resumeManager.SpawnNextResume(selectedPerson); allPersons.RemoveAt(randomIndex); resumeSpawned = true; } } public void LeaveRoom() { isExiting = true; agent.SetDestination(exitPoint.transform.position); Vector3 rotation = npcTorso.transform.eulerAngles; rotation.z = -90f; npcTorso.transform.eulerAngles = rotation; SetAnimationState(walking: true); doorAnimatorExit.SetBool("isNearby", true); StartCoroutine(CloseExitDoorAfterDelay()); } private void ReturnToPool() { ResetNPCState(); NPCPool.npcInstance.ReturnToPool(gameObject); } public void ResetNPCState() { isExiting = false; resumeSpawned = false; Stamping.isStamped = false; SetAnimationState(idle: true); agent.ResetPath(); } private void SetAnimationState(bool idle = false, bool walking = false, bool sitting = false) { if (idle) { animator.SetInteger("legs", 0); animator.SetInteger("arms", 0); } else if (walking) { animator.SetInteger("legs", 1); animator.SetInteger("arms", 1); } else if (sitting) { animator.SetInteger("legs", 3); animator.SetInteger("arms", 3); } } private IEnumerator CloseEnterDoorAfterDelay() { yield return new WaitForSeconds(2f); doorAnimatorEnter.SetBool("isEntering", false); } private IEnumerator CloseExitDoorAfterDelay() { yield return new WaitForSeconds(3f); doorAnimatorExit.SetBool("isNearby", false); } }