서론
적이 항상 플레이어만을 노리는 구현 방식이라면,
아군 유닛이나 장애물을 배치해도 무시되어 버려,
게임성이 단조로워지기 쉽습니다.
이번에는,
"평상시에는 플레이어를 노린다"
"근처에 아군 유닛이 있으면 그쪽을 노린다"
"격파 후에는 원래 목표로 돌아간다"
라는 타겟 전환 처리를 구현합니다.
하고 싶은 것
- 기본 타겟 (default target)을 보유
- 일정 범위 내의 다른 타겟을 감지
- 조건에 맞으면 타겟을 전환
- 전환 대상이 쓰러지면 원래 타겟으로 복귀
예를 들어 다음과 같은 상황을 상정합니다.
- 적은 평상시에는 플레이어를 추적
- 아군 유닛이 근처에 있는 경우에는 그쪽을 공격
- 아군 유닛 격파 후에는 다시 플레이어를 추적
이러한 메커니즘을 만듦으로써,
적의 행동에 변화를 줄 수 있습니다.
구현 방침
defaultTarget을 보유
currentTarget을 현재의 공격 대상으로 설정
- 일정 범위 내의 후보를 탐색
- 후보가 있으면
currentTarget을 교체
- 후보가 무효가 되면
defaultTarget으로 복귀
구현 예시
이번에는 다음과 같은 흐름으로 타겟을 전환하고 있습니다.
- 현재 타겟이 유효한지 확인
- 무효라면 기본 타겟으로 복귀
- 주변의 타겟 후보를 검색
- 더 우선순위가 높은 대상을 발견하면 전환
주변의 타겟 후보는
OverlapSphereNonAlloc을 이용하여 주변 대상을 취득하고,
가장 거리가 가까운 오브젝트를 선택하고 있습니다.
[SerializeField] private GameObject defaultTarget;
[SerializeField] private GameObject currentTarget;
private void Update()
...
참고로, 샘플에서는 이해를 돕기 위해 Update() 내에서 탐색하고 있지만,
실제 구현 시에는 일정 간격으로 검색하는 것이 부하를 줄일 수 있습니다.
구현 시 주의점
요약
적의 타겟을 고정하지 않고 상황에 따라 전환할 수 있게 만들면,
게임다운 심리전(駆け引き)을 만들기 쉬워집니다.
이번처럼 기본 타겟을 보유하고 있으면,
일시적인 타겟 변경과 복귀 처리도 비교적 심플하게 구현할 수 있습니다.
Discussion