KNU_SpaceShooter/Assets/02_Scripts/MonsterController.cs
2024-09-12 17:12:12 +09:00

99 lines
2.4 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class MonsterController : MonoBehaviour
{
public enum State
{
IDLE, TRACE, ATTACK, DIE
}
public State monsterState;
public float attackDist = 2.0f;
public float traceDist = 10.0f;
public bool isDie = false;
public Transform playerTr, monsterTr;
private NavMeshAgent agent;
private Animator animator;
// Start is called before the first frame update
void Start()
{
playerTr = GameObject.Find("Player").GetComponent<Transform>();
monsterTr = transform;
agent = GetComponent<NavMeshAgent>();
animator = GetComponent<Animator>();
StartCoroutine(CheckMonsterState());
StartCoroutine(MonsterAction());
}
IEnumerator CheckMonsterState()
{
while (!isDie)
{
// 거리 계산
float distance = Vector3.Distance(playerTr.position, monsterTr.position);
if (distance <= attackDist)
{
monsterState = State.ATTACK;
}
else if (distance <= traceDist)
{
monsterState = State.TRACE;
}
else
{
monsterState = State.IDLE;
}
yield return new WaitForSeconds(0.3f);
}
}
IEnumerator MonsterAction()
{
while (!isDie)
{
switch (monsterState)
{
case State.IDLE:
agent.isStopped = true;
animator.SetBool("IsTrace", false);
break;
case State.TRACE:
// 추적 시작
agent.SetDestination(playerTr.position);
agent.isStopped = false;
animator.SetBool("IsAttack", false);
animator.SetBool("IsTrace", true);
break;
case State.ATTACK:
animator.SetBool("IsAttack", true);
break;
case State.DIE:
break;
}
yield return new WaitForSeconds(0.3f);
}
}
void OnCollisionEnter(Collision coll)
{
if (coll.collider.CompareTag("BULLET"))
{
Destroy(coll.gameObject);
}
}
}