본문 바로가기

언리얼엔진/C++슈팅프로젝트제작

적 방향 결정

우선 EnemyActor.h에 추첨확율을 저장할 traceRate와 dir을 선언합니다.

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;
	UPROPERTY(EditAnywhere)
	class UBoxComponent* boxComp;

	UPROPERTY(EditAnywhere)
	class UStaticMeshComponent* meshComp;

	UPROPERTY(EditAnywhere)
	int32 traceRate = 50;

private:
	FVector dir;

방향추첨 기능은 블루프린트 생성시 결정해야 하므로 BeginPlay()함수에 구현해 줍니다.

void AEnemyActor::BeginPlay()
{
	Super::BeginPlay();
	int32 drawResult = FMath::RandRange(1, 100);
	if (drawResult <= traceRate) {
		for (TActorIterator<APlayerPawn> player(GetWorld()); player; ++player) {
			if (player->GetName().Contains(TEXT("BP_PlayerPawn"))) {
				dir = player->GetActorLocation() - GetActorLocation();
				dir.Normalize();
			}
		}
	}
	else {
		dir = GetActorForwardVector();
	}
}

게임상의 PlayerPawn클래스를 찾기 위해 TActorIterator<>를 사용합니다. EngineUtils.h를 선언해 줘야 합니다. PlayerPawn.h도 필요합니다.

#include "EnemyActor.h"
#include "Components/BoxComponent.h"
#include "Components/StaticMeshComponent.h"
#include "EngineUtils.h"
#include "PlayerPawn.h"

PlayerPawn클래스가 여러개 있을 경우 이름이 BP_PlayerPawn인지 검사합니다. 

이렇게 찾은 player와 EnemyActor와의 Location()의 벡터차가 에너미가 향할방향입니다. 

traceRate보다 작을경우 forwardVector를 지정 앞으로 나가게 합니다.