게임개발/Unreal C++

[Unreal]#15_Line Of Sight, Acceptance Radius of AI

Hardii2 2022. 10. 2. 13:22

 

[Unreal]#15_Line Of Sight, Acceptance Radius of AI

Unreal 개발 중 "AI Controller"에 대해 알아보겠습니다.

"Simple Shooter Game"의 AI Player 개발 내용입니다.

 

 


 

Acceptance Radius

1. ShooterAIController.h

// ShooterAIController.h...

#pragma once

#include "CoreMinimal.h"
#include "AIController.h"
#include "ShooterAIController.generated.h"

/**
 * 
 */
UCLASS()
class SIMPLESHOOTERNEW_API AShooterAIController : public AAIController
{
	GENERATED_BODY()
public:
	virtual void BeginPlay() override;

	virtual void Tick(float DeltaSeconds) override;

private:
	UPROPERTY()
	class APawn* PlayerPawn;

private:
	// 최대 시야 범위 값 Default 설정 및 Editor에 노출
	UPROPERTY(EditAnywhere)
	float AcceptanceRadius = 200.f;
};
  • Acceptance Radius : AI가 목표지점에 도착했음을 인식하기 위한 최소한의 거리

 

2. ShooterAIController.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "ShooterAIController.h"
#include "Kismet/GameplayStatics.h"

void AShooterAIController::BeginPlay()
{
    Super::BeginPlay();

    PlayerPawn = UGameplayStatics::GetPlayerPawn(GetWorld(), 0);
}

void AShooterAIController::Tick(float DeltaSeconds)
{
    Super::Tick(DeltaSeconds);

    SetFocus(PlayerPawn);
    MoveToActor(PlayerPawn, AcceptanceRadius);
}
EPathFollowingRequestResult::Type MoveToActor
(
    AActor * Goal,
    float AcceptanceRadius,
    bool bStopOnOverlap,
    bool bUsePathfinding,
    bool bCanStrafe,
    TSubclassOf< UNavigationQueryFilter > FilterClass,
    bool bAllowPartialPath
)
  • Accceptance Radius 를 통해 Player를 중심으로 AI가 객체가 유지할 최소한의 거리를 보장합니다.

 

Line Of Sight

1. ShooterAIController::Tick(float DeltaSeconds)

void AShooterAIController::Tick(float DeltaSeconds)
{
    Super::Tick(DeltaSeconds);

    PlayerPawn = UGameplayStatics::GetPlayerPawn(GetWorld(), 0);
    if (LineOfSightTo(PlayerPawn) == true)
    {
        SetFocus(PlayerPawn);
        MoveToActor(PlayerPawn, AcceptanceRadius+300.f);
    }else
    {
        ClearFocus(EAIFocusPriority::Gameplay);
        StopMovement();
    }
}

1. AAIController::LineOfSightTo()

bool AAIController::LineOfSightTo(
        const AActor* Other, 
        FVector ViewPoint, 
        bool bAlternateChecks
    ) const
  • AI의 Controller, 즉 AI를 소유하는 Controller가 특정 Actor를 볼 수 있는지 여부를 반환합니다.

2. AAIController::ClearFocus()

void AAIController::ClearFocus(EAIFocusPriority::Type InPriority)
  • SetFocus()를 통해 설정한 Focal Point를 해제합니다.

3. AAIController::StopMovement()

void AAIController::StopMovement()
  • Controller가 현재 수행 중인 Movemnt 동작을 멈춥니다.