1. 네비 메쉬 배치(NavMeshBoundsVolume)
AI가 이동할 수 있는 길인지 판단할 수 있는 투명한 메쉬를 배치한다.
레벨에 배치 후 충분히 크게 확장한다. 확장은 브러시 세팅에서 설정할 수 있다.
2. 쳐다보기 & 길 찾기 알고리즘 - ShooterAIController.cpp
#include "ShooterAIController.h"
#include "Kismet/GameplayStatics.h"
void AShooterAIController::BeginPlay()
{
Super::BeginPlay();
}
void AShooterAIController::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// 길 찾기 알고리즘 적용
APawn* PlayerPawn = UGameplayStatics::GetPlayerPawn(GetWorld(), 0);
// 시선(LineOfSight) -> 움직임(MoveTo) -> SetFocus
if (LineOfSightTo(PlayerPawn));
{
MoveToActor(PlayerPawn, 200);
SetFocus(PlayerPawn);
}
else
{
ClearFocus(EAIFocusPriority::Gameplay);
StopMovement();
}
}
(1) 주시
플레이어의 폰을 찾아 고개를 돌리는 코드를 작성한다.
(2) 길 찾기 알고리즘 적용
MoveToActor 함수를 사용하여 찾고자 하는 액터의 위치로 이동한다.
이동하는 데에는 A* 알고리즘을 사용한다.
두번째 인수는 상대에게서 얼마만큼 떨어진 위치까지 도달할지 결정한다.
(3) 우선권(EAIFocusPriority)
AI가 어떤 대상에 더 관심을 줄지 설정한다.
- Default(기본)
이동, GamePlay 상태가 아닐 때 수행하는 동작.
- Move(이동)
경로를 따라 이동을 우선시 함.
- GamePlay(게임 플레이 - 사격, 수색 등등)
발생 조건에 따른 대응을 우선시 함.
(4) LineOfSightTo 함수
해당 컨트롤러가 적용 중인 액터의 눈 위치를 자동으로 계산해 인수로 받은 액터를 바라보는지 검증한다.
불리언 값을 반환한다.
- 참일 경우
AI가 플레이어 폰을 바라보고 있으므로, 고개를 돌리고 폰을 향해 다가온다.
이때 MoveTo의 우선권이 더 먼저 있으므로 코드의 순서가 바뀌어도 상관 없다.
- 거짓일 경우
설정된 포커스를 해제하고 제자리에 멈춘다.
3. 인식범위 재조정
private:
UPROPERTY(EditAnywhere)
float AcceptanceRadius = 200.f;
if (LineOfSightTo(PlayerPawn));
{
MoveToActor(PlayerPawn, AcceptanceRadius);
SetFocus(PlayerPawn);
}
에디터에서 조정할 수 있도록 인식 범위를 추가한다.
'UE 5 스터디 > C++' 카테고리의 다른 글
9. 비헤이비어 트리 노드 생성하기 (0) | 2024.03.08 |
---|---|
8. 비헤이비어 트리와 블랙 보드 (0) | 2024.03.07 |
6. 액터에 데미지 입히기(FDamageEvent, TakeDamage) (0) | 2024.03.07 |
5. 라인 트레이스(LineTraceSingleByChannel) (0) | 2024.03.06 |
4. 이펙트 스포닝하기(SpawnEmitterAttached) (0) | 2024.03.06 |