처음에는 투명상태에서 움직임이 멈춰있는 상태
void PassiveUpdate() { if (aiState == AIState.Wandering && agent.remainingDistance < 0.1f) { SetState(AIState.Idle); Invoke("WanderToNewLocation", Random.Range(minWanderWaitTime, maxWanderWaitTime)); } if (playerDistance < detectDistance) // 플레이어 감지하고 공격 상태 { SetState(AIState.Attacking); } else if (aiState != AIState.Wandering) // 플레이어가 도망갔을 때 { SetState(AIState.Wandering); Invoke("BecomeInvisible", Random.Range(minWanderWaitTime, maxWanderWaitTime)); // Wandering 후 투명화 } } void BecomeInvisible() { if (aiState == AIState.Wandering) // Wandering 상태에서만 실행 { SetState(AIState.Idle); if (monster != null) { monster.BecomeInvisible(); } } }
몬스터를 감지하면 몬스터가 움직이기 시작(IDetectable 연결)
public class Monster : Entity , IDetectable { [SerializeField] private MonsterController controller; [SerializeField] private MeshRenderer renderer; public bool isRevealed = false; public override void Init() { base.Init(); } private void Awake() { } public void Detected() { } public void Revealed() { //controller.isRevealed = true; if (!isRevealed) { isRevealed = true; renderer.enabled = true; controller.SetState(AIState.Wandering); } } public void BecomeInvisible() { if (isRevealed) { isRevealed = false; if (renderer != null) { renderer.enabled = false; } if (controller != null) { controller.SetState(AIState.Idle); } } } }
플레이어 감지하고 바라보기
private void LookingAtPlayerUpdate() { if (playerDistance > lookAtPlayerDistance) { SetState(AIState.Wandering); } else { Vector3 directionToPlayer = (playerTransform.position - transform.position).normalized; Quaternion lookRotation = Quaternion.LookRotation(directionToPlayer); transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * 5f); } }