오늘은 Enemy 캐릭터 AI 움직임을 구현하였다.
AI의 현재 상태
public enum AIState
{
Idle,
Walk,
Attack
}
Update문
protected virtual void Update()
{
_playerToEnemyDistance = Vector3.Distance(transform.position, CharacterManager.Instance.Player.transform.position);
SetAnimator(_state);
switch (_state)
{
case AIState.Idle:
DetectPlayer();
break;
case AIState.Walk:
DetectPlayer();
break;
case AIState.Attack:
AttackPlayer();
break;
}
}
매 프레임마다 Player와 Enemy 사이 거리를 검사하고
현재 상태에 따른 애니메이션과 메서드를 부여해준다.
DetectPlayer
void DetectPlayer()
{
if (_state == AIState.Walk && agent.remainingDistance < 0.1f)
{
SetState(AIState.Idle);
Invoke("WalkToNewLocation", _detectCoolTime);
}
if (_playerToEnemyDistance < _detectDistance)
{
SetState(AIState.Attack);
}
}
Idle, Walk 상태 때 실행
만약 AI가 걷고있고, 목적지까지 거의 도달했으면 Idle 상태로 변한 후 다음으로 걸어갈 위치를 찾는다
만약 플레이어와의 거리가 플레이어 감지거리 안, 즉 플레이어를 탐지하면 공격 상태로 변한다
AttackPlayer
protected virtual void AttackPlayer()
{
// TODO :: 시야각 다시 보기 & 뒤에선 attack state로 안바뀌게 구현
// 플레이어가 공격 범위 안에 없거나 시야에서 안보이면 다시 경로 찾기
if (_playerToEnemyDistance > _attackDistance || !IsPlayerInFieldOfView())
{
agent.isStopped = false;
NavMeshPath path = new NavMeshPath();
if (agent.CalculatePath(CharacterManager.Instance.Player.transform.position, path))
{
agent.SetDestination(CharacterManager.Instance.Player.transform.position);
}
}
// 플레이어가 공격 범위 안에 있으면 -> 이거 하위 자식 스크립트에서 구현하자
else if (_playerToEnemyDistance <= _attackDistance)
{
agent.isStopped = true;
if (Time.time - lastAttackTime > _attackCooltime)
{
lastAttackTime = Time.time;
// TODO :: 플레이어 공격 구현시 연동
animator.speed = 1;
animator.SetTrigger("Attack");
agent.isStopped = false;
}
}
}
Attack 상태일 때 실행
아직 완벽히 구현되지 않았다.
이 Enemy 클래스를 상속받는 보스나 근접공격 몹, 원거리 공격 몹에게서 override 구현할 예정
또 몬스터의 시야에 플레이어가 보일 때만 NavMeshPath를 지정하도록 수정해야 한다.
따라와서 치긴한다.
아직 공격 부분은 구현을 못해서..
내일의 내가 하겠지 .. ?
(플레이어는 팀원분이 아직 구현을 덜하셔서 모습이 저렇다.
내일 모레면 멀쩡해질 예정ㅋㅋ 내일은 현충일이니까 ^_ ^)
'게임 개발' 카테고리의 다른 글
[Unity] The Love 게임 - (4) (0) | 2024.06.10 |
---|---|
[Unity] The Love 게임 - (3) (0) | 2024.06.07 |
[Unity] The Love 게임 - (1) (0) | 2024.06.04 |
[Unity] 3D-Dungeon - 움직이는 발판 (0) | 2024.05.30 |
[Unity] 3D-Dungeon (0) | 2024.05.28 |