[SerializeField]
float _scanRange = 3.0f;
[SerializeField]
float _attackRange = 1.0f;
몬스터가 플레이어를 감지하고 공격하는 거리를 정하였다.
protected override void UpdateIdle()
{
// 플레이어를 찾고, 사정거리 내에 있으면 State를 Moving으로 변경
GameObject player = GameObject.FindGameObjectWithTag("Player");
if (player == null)
return;
float distance = (player.transform.position - transform.position).magnitude;
if (distance <= _scanRange)
{
_lockTarget = player;
State = Define.State.Moving;
return;
}
}
Idle 상태에서 플레이어가 사정거리 내에 있으면 상태를 Moving으로 변경한다.
protected override void UpdateMoving()
{
// 플레이어가 사정거리 내면 공격
if (_lockTarget != null)
{
_destPos = _lockTarget.transform.position;
float dist = (_destPos - transform.position).magnitude;
if (dist <= _attackRange)
{
// 공격상태가 되면 이동을 멈춘다.
NavMeshAgent nma = gameObject.GetOrAddCompoent<NavMeshAgent>();
nma.SetDestination(transform.position);
State = Define.State.SKill;
return;
}
}
// 이동
Vector3 dir = _destPos - transform.position;
if (dir.magnitude < 0.01f)
State = Define.State.Idle;
else
{
// NavMeshAgent를 사용한 이동
NavMeshAgent nma = gameObject.GetOrAddCompoent<NavMeshAgent>();
// 목적지를 설정하면 해당한 곳으로 이동
nma.SetDestination(_destPos);
nma.speed = _stat.MoveSpeed;
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(dir), 10 * Time.deltaTime);
}
}
사정거리 내인 경우 공격을 시작한다.
그렇지 않은 경우 플레이어를 향해 이동한다.
void OnHitEvent()
{
if (_lockTarget != null)
{
Stat targetStat = _lockTarget.GetComponent<Stat>();
Stat myStat = gameObject.GetComponent<Stat>();
int damage = Mathf.Max(0, myStat.Attack - targetStat.Defense);
targetStat.Hp -= damage;
if (targetStat.Hp > 0)
{
float distance = (_lockTarget.transform.position - transform.position).magnitude;
if (distance <= _attackRange)
State = Define.State.SKill;
else
State = Define.State.Moving;
}
else
{
State = Define.State.Moving;
}
}
else
{
State = Define.State.Idle;
}
}
공격 애니메이션을 취할때 사용하는 이벤트 함수이다.
몬스터가 플레이어를 공격하면 플레이어의 hp를 깎는다.
또한 피 상태에 따라서 몬스터의 상태를 변경한다.
몬스터가 잘 따라와서 플레이어를 공격한다.