몬스터를 구현할 때 어떻게 행동할지도 정해주어야 한다. 몬스터의 행동은 크게 세가지로 나눌 수 있다.
플레이어 공격을 구현할 때 코루틴을 사용했는데 몬스터 AI역시 코루틴을 사용한다. 이동방식은 기존의 방식을 사용해 이동하고자 하는 좌표로 한칸씩 이동하는 방식이며 코루틴으로 일정시간동안 랜덤한 위치를 목표좌표로 설정한다.
Coroutine _coPatrol = StartCoroutine("CoPatrol");
IEnumerator CoPatrol()
{
int waitSeconds = Random.Range(1, 4);
yield return new WaitForSeconds(waitSeconds);
for (int i = 0; i < 10; i++)
{
int xRange = Random.Range(-5, 6);
int yRange = Random.Range(-5, 6);
Vector3Int randPos = CellPos + new Vector3Int(xRange, yRange, 0);
if (Managers.Map.CanGo(randPos) && Managers.Object.Find(randPos) == null)
{
_destCellPos = randPos;
State = CreatureState.Moving;
yield break;
}
}
State = CreatureState.Idle;
}
몬스터가 특정 위치로 이동하기 위해서는 특정 조건이 만족해야 한다.
위 두가지 조건을 만족하면 몬스터가 이동할 수 있다고 할 수 있으며 이 내용은 위 코드의 조건문에 반영되어 있다. 만약 이동할 수 있으면 목표좌표를 설정하고 몬스터의 상태를 Moving
상태로 바꿔준다.
또한 이후에 StartCoroutine를 호출하기 위해 다음과 같은 코드를 추가해야 한다.
if (_coPatrol != null)
{
StopCoroutine(_coPatrol);
_coPatrol = null;
}
Coroutine _coSearch = StartCoroutine("CoSearch");
IEnumerator CoSearch()
{
while (true)
{
yield return new WaitForSeconds(1);
if (_target != null)
continue;
_target = Managers.Object.Find((go) =>
{
PlayerController pc = go.GetComponent<PlayerController>();
if (pc == null)
return false;
Vector3Int dir = (pc.CellPos - CellPos);
if (dir.magnitude > _searchRange)
return false;
return true;
});
}
}
탐색은 공격과 다르게 매순간마다 해주어야 하기 때문에 코루틴안에 무한루프로 설정한다. 그리고 플레이어를 탐색하는데 거리가 탐지범위보다 적은 플레이어를 찾고 찾은 플레이어를 target
으로 설정한다. 이후에 target
이 설정된다면 target
쪽으로 이동하거나 공격하는 것을 구현할 수 있다.
if (_target != null)
{
destPos = _target.GetComponent<CreatureController>().CellPos;
Vector3Int dir = destPos - CellPos;
if (dir.magnitude <= _skillRange && (dir.x == 0 || dir.y == 0))
{
Dir = GetDirFromVec(dir);
State = CreatureState.Skill;
if (_rangedSkill)
_coSkill = StartCoroutine("CoStartShootArrow");
else
_coSkill = StartCoroutine("CoStartPunch");
return;
}
}
공격을 하는 부분은 코루틴이 아닌 탐색과정에서 target
이 설정되었고 target
과의 거리가 멀다면 이동을 공격사정거리내에 있다면 공격을 해야하기 때문에 이동을 처리하는 부분에 공격상태로의 전환이 필요하다. 공격을 하기위한 조건은 두가지가 있다.
2번 조건은 원거리 공격의 경우 투사체를 날리기 위한 조건이다. target
의 위치가 이동하고자 하는 좌표이기 때문에 target
이 있어도 이동하는 과정은 동일하다.
공격과정에서 사용된 코루틴은 [플레이어 공격 - 2D]이다.