https://dev.epicgames.com/community/learning/tutorials/qO/c-for-blueprinters
위 영상을 바탕으로 개인적인 정리를 위해 작성된 글입니다.
C++ 클래스
헤더 파일은 클래스, 프로퍼티, 함수 선언이 포함됩니다.
접두사 A를 가지는 클래스는 모든 Actor 서브클래스의 표준입니다.
':'의 오른쪽에 있는것은 부모 클래스를 나타냅니다.
클래스 이름 왼쪽에는 클래스 키와 어느 모듈로부터 익스포트하는지 나옵니다.
상단의 include 헤더파일을 나타냅니다. 다른 파일을 참조할 때 사용합니다.
generated.h 파일은 블루프린트에 자동 노출하기 위해 엔진에서 생성합니다.
이를 UObject 시스템이라고 합니다.
아래에는 여러 매크로가 있습니다. UObject는 UCLASS()와 GENERATED_BODY에 둘러싸여 블루프린트에 클래스를 노출합니다.
UObject는 생성할때마다 UObject 시스템에 관리되기 때문에 메모리를 관리할 필요가 없습니다.(마크앤 스윕)
생성자 클래스 이름과 같은 함수이며 액터에 컴포넌트를 생성하고 추가할 때 사용합니다.
BeginPlay, Tick, SetupPlayerInputComponent 들이 있고 접근제한자도 있습니다.(public 어디서든, protected 소유하거나 서브클래스, private 소유자만)
캐릭터 매시 소켓에 접근하여 퍼셉션 시스템에 위치와 회전을 제공하기
Get Actor Eyes View Point는 눈높이 변수를 사용하여 캐릭터 캡슐의 위쪽 위치(매시 소켓)를 반환하고 올바른 방향으로 회전 포인트를 제공합니다.
그러나 마네킹이 고개를 돌릴 때 따라가지 않으므로 이를 오버라이드해서 수정해줘야 합니다. 합니다.
// AdvancedCharacter.h
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FName EyeSocketName;
// AdvancedCharacter.cpp
// 아래 매개변수들은 레퍼런스 타입이기 때문에 변경값을 전달합니다.
void AAdvancedCharacter::GetActorEyesViewPoint(FVector& Location, FRotator& Rotattion) const
{
Location = GetMesh()->GetSocketLocation(EyeSocketName);
Rotation = GetMesh()->GetSocketRotation(EyeSocketName);
}
BP_클래스의 부모를 새로만든 클래스로 바꿔서 적용을 해줍니다.
EyesViewpoint를 EyeSocketName에 작성해 줍니다.
※ AI디버그는 작은 따음표 키를 눌러 실행할 수 있습니다.
※ 숫자 4키를 누르면 퍼셉션이 적용됩니다.
Perception
Unreal Engine에서 "Perception" 또는 "AI Perception" 시스템은 인공 지능(AI) 캐릭터가 환경을 인지하고, 플레이어나 다른 캐릭터의 존재를 감지하는 데 사용됩니다. 이 시스템은 주로 AI가 게임 세계 내에서 복잡한 결정을 내리고, 플레이어의 행동에 반응하는 데 필요한 정보를 제공합니다.
주요 기능 및 구성 요소
- 감각 요소:
- AI Perception 시스템은 다양한 감각을 통해 환경을 인식합니다. 대표적인 감각으로는 시각(시야), 청각(소리 감지), 그리고 기타 사용자 정의 감각이 있습니다.
- AI Perception Component:
- 이 컴포넌트는 AI 캐릭터에 부착되어, 주변 환경의 감각 정보를 수집하고 처리합니다.
- 개발자는 이 컴포넌트를 통해 감각의 범위, 감지할 수 있는 유형 등을 설정할 수 있습니다.
- Perception AI Controller:
- AI Perception 시스템은 대개 AAIController 클래스와 결합하여 사용됩니다.
- AAIController는 수집된 감각 정보를 기반으로 AI의 행동을 결정하고 제어합니다.
- Stimuli Source:
- 환경 내의 오브젝트나 캐릭터는 "Stimuli Source"로 작동할 수 있으며, 이를 통해 AI에게 감지 가능한 신호(예: 소리, 시각적 신호)를 발생시킵니다.
AI Perception의 활용
- 플레이어 감지: AI 캐릭터가 플레이어를 시각적으로 감지하거나 소리를 통해 위치를 파악하는 데 사용됩니다.
- 환경 인식: AI가 게임 세계의 중요한 이벤트나 변경 사항을 인식하는 데 도움을 줍니다.
- 복잡한 AI 행동: AI 캐릭터가 보다 현실적이고 도전적인 행동을 취하도록 합니다. 예를 들어, 숨어있는 플레이어를 찾거나 위험을 감지하는 등의 행동입니다.
Unreal Engine의 Perception 시스템은 AI 개발에 있어 매우 강력한 도구로, AI 캐릭터가 환경을 인지하고, 플레이어나 다른 요소에 대한 반응을 보다 현실적으로 구현할 수 있도록 돕습니다.
세계밖으로 떨어져보기
AActor::FellOutOfWorld
: 주로 캐릭터나 액터가 게임 세계의 경계를 벗어날 때 호출됩니다.
References
Module | Engine |
Header | /Engine/Source/Runtime/Engine/Classes/GameFramework/Actor.h |
Include | #include "GameFramework/Actor.h" |
Source | /Engine/Source/Runtime/Engine/Private/Actor.cpp |
Syntax
virtual void FellOutOfWorld
(
const class UDamageType & dmgType
)
영상에서의 구현 예제
// .h
void FellOutOfWorld(const class UDamage& dmgType) override;
public:
UFUNCTION(BlueprintImplemenatableEvent)
void OnFellOutOfWorld();
// .cpp
void AAdvancedCharacter::FellOutOfWorld(const class UDamageType& dmgType)
{
OnFellOutOfWorld();
}
Blueprint Function Library를 사용하여 가까운 사람 반환하기
Unreal Engine에서 "Blueprint Function Library"는 C++로 작성된 함수들을 블루프린트 시스템에서 사용할 수 있게 해주는 기능입니다. 이 라이브러리를 통해 개발자들은 C++에서 작성된 코드를 블루프린트에서 직접 호출할 수 있으며, 이를 통해 프로그래밍 로직과 블루프린트 사이의 간격을 좁힐 수 있습니다.
사용 예제
UFUNCTION(BlueprintCallable, Categroy = "Utilites", meta = (WorldContect = "WorldContextObject", DeterminesOutputType = "ActorClass" )
static class AActor* GetActorOfClass(const UObject* WorldContextObject, TSubclassOf<AActor> ActorClass);
- BlueprintCallable : 블루프린트 호출 가능 지정자
- Categroy : 카테고리 지정자
- meta : 메타 지정자
- WorldContect : (메타 지정자)"WorldContextObject" 암시적으로 호출하는 오브젝트로 설정된다는 의미입니다. 그래서 편리하게 숨겨져 있습니다. 자체 변수로 선언되었다고 생각해도 됩니다.
- "WorldContextObject" : 쿼리 같은 것들의 게임 월드에 접근하기 위해 사용됩니다.
- DeterminesOutputType : 출력 유형을 결정하고 반환되는 오브젝트가 "ActorClass" 파라미터에서 지정하는 클래스에 형변환된다는 사실을 블루프린트에 암시합니다. 입력과 아웃풋 형식을 맞추어 줍니다.
- static은 이 함수가 입력 파라미터에서만 작동할 것임을 나타냅니다.(일반적으로 헬퍼함수)
- 액터 포인터를 반환하는데, 이 경우 액터 인스턴스가 될 것입니다.
- TSubclassOf : 이 파라미터가 <> 서브클래스 레퍼런스만 받아들인다는 의미입니다.
※ 스태틱 함수의 경우 ::를 사용하여 호출하여야 합니다.
cpp 예제
// .cpp
class AActor* GetNearestActorOfClass(const UObject* WorldContextObject, TSubclassOf<AActor> ActorClass, FVector Location, float Radius)
{
AActor* NearestActor = NULL;
float NearestDistance = Radius;
TArray<AActor*> OutActors;
UGameplayStatics::GetAllActorsOffClass(WorldContextObject, ActorClass, OutActors);
for (AActor* Actor : OutActors)
{
float Distance = FVector::Distance(Location, Actor->GetActorLocation());
if (Distance < NearestDistance)
{
NearestActor = Actor;
NearestDistance = Distance;
}
}
return NearestActor;
}
C++에서 생성하는 'Text Render' 컴포넌트로 마네킹 위에 느낌표 추가하기
// .h
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Alert)
class UTextRenderComponent* AlertTextComponent;
// .cpp
#include <Components/TextRenderComponent.h>
// 생성자안에
AlertTextComponent = CreateDefaultSubobject<UTextRenderComponent>(TEXT("Alert"));
if (AlertTextComponent)
{
AlertTextComponent->SetupAttachment(GetMesh(), "head");
}
텍스트 렌더 컴포넌트를 "Set Alert Enabled" 이벤트에 연결해야 합니다.
- 이 이벤트는 AI가 캐릭터를 탐지할 떄마다 호출됩니다.
'Unreal 공부' 카테고리의 다른 글
[UE] Breaking Down the Components of Gameplay (0) | 2023.11.27 |
---|---|
언리얼 C++ 기본 타입과 문자열 (1) | 2023.11.03 |
언리얼 엔진 코딩 표준 (0) | 2023.11.02 |
[Unreal] 오버랩 이벤트, 히트 이벤트 (1) | 2023.10.05 |
[Unreal] C++ 파일이 먹통이 됬을때 (and UE 인텔리센스 Fix 펌) (1) | 2023.10.03 |