AGameMode
AGameModeBase
AGameModeBase는 언리얼 엔진에서 게임의 규칙, 플레이 흐름 및 게임 특정 로직을 관리하는 클래스입니다. 이 클래스는 게임의 기본적인 구조와 규칙을 설정하는 데 사용되며, 게임의 시작과 종료, 플레이어의 스폰 및 점수 계산 등의 핵심적인 게임 메커니즘을 정의합니다.
References
Module | Engine |
Header | /Engine/Source/Runtime/Engine/Classes/GameFramework/GameModeBase.h |
Include | #include "GameFramework/GameModeBase.h" |
Syntax : class AGameModeBase : public AInfo
AGameModeBase의 주요 기능
- 게임 규칙 정의: 게임의 기본 규칙과 플레이 방식을 정의합니다. 예를 들어, 게임에서 승리하는 조건, 게임 오버의 조건 등을 설정할 수 있습니다.
- 플레이어 스폰 관리: 플레이어 캐릭터가 게임 세계에 어떻게 생성되는지 관리합니다. 이는 플레이어가 게임에 처음 참여할 때, 캐릭터가 사망한 후 재생성될 때 등에 적용됩니다.
- 게임 세션 관리: 게임의 시작과 종료를 관리하며, 게임의 전반적인 흐름을 제어합니다.
- 스코어링 및 게임 결과: 게임의 점수 계산 및 승리/패배 로직을 관리합니다.
AGameModeBase의 사용
- 커스텀 게임 모드 생성: 개발자는 AGameModeBase를 상속받아 자신만의 게임 모드를 만들 수 있습니다. 이를 통해 특정 게임의 요구 사항에 맞는 맞춤형 게임 플레이를 구현할 수 있습니다.
- 블루프린트 활용: AGameModeBase는 블루프린트를 통해 쉽게 확장하고 수정할 수 있어, 프로그래밍 지식이 없는 개발자나 디자이너도 게임 모드를 손쉽게 조정할 수 있습니다.
주의사항
- 멀티플레이어 고려: 멀티플레이어 게임을 개발할 때는 AGameModeBase가 서버에만 존재하며 클라이언트에는 존재하지 않는다는 점을 고려해야 합니다. 따라서 클라이언트와 서버 간의 상호작용을 디자인할 때 이를 염두에 두어야 합니다.
AGameModeBase는 언리얼 엔진에서 게임의 기본적인 틀과 규칙을 설정하는 중요한 클래스로, 게임의 핵심적인 플레이 흐름과 메커니즘을 정의하는 데 사용됩니다.
AGameMode
AGameMode 클래스는 언리얼 엔진에서 게임의 규칙과 흐름을 정의하는 데 사용됩니다. 이 클래스는 게임의 전반적인 논리와 규칙을 제어하며, 게임이 시작되고 종료되는 방법, 플레이어가 어떻게 게임에 참여하고, 게임에서 어떤 이벤트가 발생하는지 등을 결정합니다.
기능 및 특징
- 게임 규칙 정의: AGameMode는 게임의 승리 조건, 점수 계산 방법, 게임 진행 규칙 등을 정의합니다.
- 플레이어 관리: 플레이어의 생성, 연결 끊기, 재생성 등을 관리합니다. 예를 들어, 플레이어가 게임에 처음 연결될 때 AGameMode는 적절한 APlayerController를 생성하고, 플레이어의 캐릭터를 생성할 수 있습니다.
- 세션 관리: 게임의 시작과 종료를 관리합니다. 예를 들어, 모든 플레이어가 준비되면 게임을 시작하고, 특정 조건이 충족되면 게임을 종료시킵니다.
- 커스텀 로직 구현: 개발자는 AGameMode를 상속받아 자신만의 게임 규칙, 로직, 플레이어 행동 등을 구현할 수 있습니다.
- 이벤트 처리: 게임 중 발생하는 다양한 이벤트(예: 플레이어의 사망, 점수 획득 등)를 처리합니다.
예시 코드
class AMyGameMode : public AGameMode
{
AMyGameMode()
{
// 여기에서 커스텀 게임모드 설정을 초기화합니다.
}
virtual void StartPlay() override
{
Super::StartPlay();
// 게임 시작 로직을 여기에 추가합니다.
}
};
- 이 코드는 AGameMode를 상속받는 커스텀 게임 모드 클래스를 정의하는 기본적인 예시입니다. 여기서 StartPlay 함수는 게임이 시작될 때 호출되며, 게임 시작에 관련된 로직을 구현할 수 있습니다.
주의사항
- 컨텍스트: AGameMode는 주로 서버 측에서 실행되며, 클라이언트에게는 제한된 정보만 제공됩니다.
- 커스텀화: 특정 게임 요구사항에 맞게 AGameMode를 상속받아 커스텀 게임 모드를 만들 수 있습니다. 이를 통해 게임의 독특한 규칙과 메커니즘을 구현할 수 있습니다.
- 레벨 디자인과 연동: AGameMode는 레벨 디자인과 밀접하게 연동되어, 특정 레벨에 대한 게임 규칙을 설정하는 데 사용될 수 있습니다.
AGameMode의 장점
- 고급 기능 제공: AGameMode는 AGameModeBase의 모든 기능을 포함하며, 추가적으로 더 복잡하고 고급적인 게임 규칙과 로직을 구현할 수 있는 기능을 제공합니다.
- 플레이어 스폰 관리: 플레이어의 스폰 위치를 선택하고 관리하는 데 필요한 메서드가 포함되어 있습니다.
- 점수 및 게임 진행 상태 관리: 점수 계산, 게임 진행 상태(예: 시간 제한, 목표 달성 등)를 관리하는 데 필요한 추가적인 메서드가 포함되어 있습니다.
- 멀티플레이어 게임에 더 적합: AGameMode는 멀티플레이어 게임에서 보다 복잡한 규칙과 상호작용이 필요할 때 사용됩니다.
결론
- AGameModeBase는 게임의 기본적인 흐름과 논리를 다루는 데 적합하며, 간단한 게임이나 더 많은 커스텀 로직이 필요하지 않은 경우에 사용됩니다.
- AGameMode는 AGameModeBase의 모든 기능을 포함하면서, 추가적인 복잡한 게임 규칙과 로직을 구현할 수 있어, 보다 복잡한 게임이나 멀티플레이어 게임에 적합합니다.
Pawn Death
AActor::SetActorHiddenInGame
액터의 가시성을 게임 플레이 중에 동적으로 제어하는 데 사용됩니다.
// 액터의 가시성을 설정하는 예
AActor* MyActor = ... // 액터 참조 얻기
MyActor->SetActorHiddenInGame(true); // 액터 숨기기
MyActor->SetActorHiddenInGame(false); // 액터 보이기
AActor::SetActorTickEnabled
액터의 "tick" 기능을 활성화하거나 비활성화하는 데 사용됩니다.
// Tick 활성화
SetActorTickEnabled(true);
// Tick 비활성화
SetActorTickEnabled(false);
AActor::DisableInput
플레이어의 입력을 특정 액터에 대해 비활성화하는 데 사용됩니다.
- 입력 비활성화: DisableInput()은 플레이어 컨트롤러로부터 오는 모든 입력을 해당 액터에 대해 비활성화합니다.
- 매개변수: 일반적으로 이 함수는 APlayerController 타입의 매개변수를 받습니다. 이는 어떤 플레이어의 입력을 비활성화할지 지정합니다.
예제 코드
// 액터에 대한 입력 비활성화 예
AActor* MyActor = ...; // 액터 참조 얻기
APlayerController* PlayerController = ...; // 플레이어 컨트롤러 참조 얻기
MyActor->DisableInput(PlayerController);
- 활성화 상태 복원 : 입력을 다시 활성화하려면 EnableInput() 함수를 사용해야 합니다. 이는 게임 상황에 따라 적절하게 관리되어야 합니다.
bShowMouseCursor
언리얼 엔진에서 주로 APlayerController 클래스 내에서 사용되는 속성입니다. 이 속성은 플레이어의 마우스 커서를 게임 화면에 보이거나 숨기는 기능을 제어합니다. bShowMouseCursor를 true 또는 false로 설정함으로써, 마우스 커서의 표시 여부를 결정할 수 있습니다.
- 마우스 커서 표시: bShowMouseCursor를 true로 설정하면, 게임 화면에 마우스 커서가 표시됩니다. 이는 주로 UI 상호작용이나 메뉴 선택 시에 유용합니다.
PlayerController->bShowMouseCursor = true;
PlayerController->bShowMouseCursor = false;
UGameplayStatics::GetGameMode
Unreal Engine에서 현재 게임 세션의 게임 모드 인스턴스에 접근하기 위해 사용됩니다.
References
Module | Engine |
Header | /Engine/Source/Runtime/Engine/Classes/Kismet/GameplayStatics.h |
Include | #include "Kismet/GameplayStatics.h" |
Source | /Engine/Source/Runtime/Engine/Private/GameplayStatics.cpp |
Syntax
static AGameModeBase * GetGameMode
(
const UObject * WorldContextObject
)
기능 및 사용법
- 게임 모드 인스턴스 반환: 이 함수는 현재 게임 세션의 AGameMode 인스턴스를 반환합니다.
AGameModeBase* CurrentGameMode = UGameplayStatics::GetGameMode(…); // 적절한 컨텍스트 제공
if (CurrentGameMode)
{
// 현재 게임 모드와 관련된 작업 수행
}
- 게임 모드 타입 : 특정 타입의 게임 모드 인스턴스에 접근하려면 반환된 AGameModeBase 인스턴스를 적절한 서브클래스로 캐스팅해야 할 수 있습니다.
FTimerHandle
FTimerHandle
Unreal Engine에서 타이머를 관리하기 위한 구조체입니다. Unreal Engine에서 타이머는 특정 시간이 지난 후 함수를 호출하거나 일정 간격으로 반복해서 함수를 호출하는 데 사용됩니다. FTimerHandle는 이러한 타이머를 유니크하게 식별하고 제어하는 데 사용됩니다.
기능 및 사용법
- 타이머 식별자: FTimerHandle는 타이머를 고유하게 식별하는 역할을 합니다. 이를 통해 특정 타이머를 시작, 중지, 재설정 등의 작업을 할 수 있습니다.
- 타이머 관리: Unreal Engine에서 UWorld 클래스의 GetTimerManager() 함수를 사용하여 타이머를 관리할 수 있습니다. 이 매니저를 통해 FTimerHandle를 사용하여 타이머를 제어합니다.
타이머 설정 예제
FTimerHandle TimerHandle;
UWorld* World = GetWorld();
if (World)
{
World->GetTimerManager().SetTimer(TimerHandle, this, &MyClass::MyFunction, 1.0f, true);
}
- 이 예제에서는 MyFunction이라는 함수를 1초 간격으로 반복적으로 호출하도록 타이머를 설정합니다. SetTimer 함수는 타이머 핸들, 호출할 객체, 호출할 함수, 지연 시간, 그리고 타이머가 반복될지 여부를 매개변수로 받습니다.
타이머 제어 예제
// 타이머 중지
World->GetTimerManager().ClearTimer(TimerHandle);
// 타이머 일시 정지 및 재개
World->GetTimerManager().PauseTimer(TimerHandle);
World->GetTimerManager().UnPauseTimer(TimerHandle);
주의사항
- 존재 여부 확인: 타이머를 제어하기 전에 FTimerHandle가 유효한 타이머를 참조하고 있는지 확인하는 것이 좋습니다.
- 메모리 관리: FTimerHandle 자체는 타이머의 메모리를 관리하지 않습니다. 따라서 타이머를 적절히 관리하고 제거하는 것은 개발자의 책임입니다.
- 콜백 함수: 타이머에 의해 호출되는 함수는 지정된 시그니처를 따라야 합니다. 예를 들어, 매개변수를 받지 않는 멤버 함수여야 합니다.
FTimerDelegate
Unreal Engine에서 타이머에 의해 호출되는 함수를 위한 델리게이트(delegate)입니다. 델리게이트는 C++에서 함수 포인터와 유사한 개념으로, 특정 함수를 참조하고 호출할 수 있게 해주는 객체입니다. FTimerDelegate는 특정 시간이 경과한 후에 실행되어야 하는 함수를 지정하는 데 사용됩니다.
기능 및 사용법
- 함수 연결: FTimerDelegate는 특정 함수를 연결하여 타이머에 의해 호출될 수 있도록 합니다.
- 유연성: FTimerDelegate를 사용하면 멤버 함수, 람다, 기타 콜백 함수를 타이머에 연결할 수 있습니다.
타이머 델리게이트 설정 예제
FTimerHandle TimerHandle;
FTimerDelegate TimerDel;
TimerDel.BindUFunction(this, FName("MyFunction"));
GetWorld()->GetTimerManager().SetTimer(TimerHandle, TimerDel, 1.0f, true);
람다 사용 예제
FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(TimerHandle, FTimerDelegate::CreateLambda([]()
{
// 타이머가 트리거될 때 실행될 코드
}), 1.0f, true);
주의사항
- 함수 시그니처: FTimerDelegate에 연결된 함수는 매개변수를 받지 않아야 합니다.
- 존재 여부 확인: 타이머를 설정하기 전에 UWorld 인스턴스와 타이머 매니저가 유효한지 확인하는 것이 좋습니다.
- 메모리 관리: 타이머와 델리게이트의 생명주기를 적절히 관리하는 것이 중요합니다.
FTimerHandle과 FTimerDelegate를 엮는 법
FTimerDelegate는 CreateUObject를 사용해 구성되고 있으며, 이는 BindUFunction과는 다른 방식입니다. 두 방식의 차이점을 설명하겠습니다.
FTimerDelegate::CreateUObject
CreateUObject는 특정 객체의 멤버 함수를 델리게이트에 연결하는 방법을 제공합니다. 이 방법은 UObject 기반 클래스의 인스턴스와 해당 클래스의 멤버 함수를 사용할 때 유용합니다.
- 사용법 예시
- 이 경우, ToonTanksPlayerController 객체의 SetPlayerEnabledState 멤버 함수를 델리게이트에 연결합니다. 이 함수는 불리언 값을 매개변수로 받으며, CreateUObject를 사용하여 이 매개변수를 델리게이트에 바인딩합니다.
FTimerDelegate TimerDelegate = FTimerDelegate::CreateUObject(ObjectInstance, &UObjectClass::FunctionName, FunctionParams...);
BindUFunction
BindUFunction은 UObject 기반 클래스의 멤버 함수를 델리게이트에 바인딩하는 다른 방법입니다. 이 방식은 함수 이름을 문자열로 지정합니다.
- 사용법 예시
- BindUFunction은 런타임에 함수 이름을 문자열로 지정할 때 유용하며, 보다 동적인 방식을 제공합니다. 함수의 이름이 컴파일 타임에 알려져 있지 않아야 하는 경우에 적합합니다.
FTimerDelegate TimerDelegate;
TimerDelegate.BindUFunction(ObjectInstance, FName("FunctionName"), FunctionParams...);
차이점
- 타입 안정성: CreateUObject는 타입 안정성이 더 높습니다. 함수 포인터를 직접 사용하기 때문에, 컴파일 타임에 오류를 잡을 수 있습니다. 반면, BindUFunction은 런타임에 문자열로 함수를 찾기 때문에, 타이핑 오류나 존재하지 않는 함수를 참조하는 실수가 발생할 수 있습니다.
- 유연성: BindUFunction은 런타임에 함수를 지정할 수 있는 유연성을 제공합니다. 함수 이름을 문자열로 지정하기 때문에, 다양한 시나리오에서 동적으로 함수를 선택할 수 있습니다.
ToonTank에서 CreateUObject를 사용한 것은 SetPlayerEnabledState 함수가 컴파일 시점에 알려진, 특정 객체의 명확한 멤버 함수이기 때문입니다. 이는 타입 안정성과 명확성을 제공하며, 이러한 컨텍스트에서 일반적으로 선호되는 방식입니다.
AActor::GetWorldTimerManager
현재 게임 월드의 타이머 매니저에 접근하는 데 사용됩니다. 타이머 매니저는 게임 내에서 다양한 타이머를 관리하고, 지정된 시간 간격이나 지연 후에 특정 함수를 실행하도록 스케줄링하는 역할을 합니다.
기능 및 사용법
- 타이머 매니저 접근: GetWorldTimerManager()는 현재 게임 월드의 FTimerManager 인스턴스에 접근합니다. 이 인스턴스를 통해 타이머를 설정하고 관리할 수 있습니다.
- 타이머 설정: FTimerManager를 사용하여 함수를 특정 시간 간격으로 반복하거나, 지정된 지연 후에 한 번 실행하도록 타이머를 설정할 수 있습니다.
예제 사용법
FTimerHandle TimerHandle;
GetWorldTimerManager().SetTimer(TimerHandle, this, &AMyClass::MyFunction, 1.0f, true);
- 이 코드는 MyFunction이라는 함수를 1초 간격으로 반복해서 호출하도록 타이머를 설정합니다.
위젯 블루프린트 를 만들고 배치한 이후 게임에서 표시되도록 하기
- 위 예제에서 Create Widget 노드는 Class 섹션 아래 지정된 위젯 블루프린트 를 호출하고 그 Return Value 는 제품 결과물입니다 (Owning Player 는 Player Controller 이며, 기본 플레이어 컨트롤러의 빈 결과에 적용되어 있습니다). Add to Viewport 가 위젯 블루프린트를 화면상에 그리며, 생성된 위젯을 담는 Main Menu 변수를 추가 타깃으로 지정하고 있습니다.
- 추가적으로, Return Value 가 Main Menu 라는 제목의 변수에 할당되어 있어, 나중에 위젯을 다시 만들지 않고도 위젯 블루프린트에 접근할 수 있으며, 필요하다면 위젯을 제거할 수도 있습니다.
Set Input Mode 및 Show Cursor
플레이어가 UI 상호작용을 못하게 했으면 하는 경우도 있을 수 있고, 사용자가 UI 를 완전히 무시했으면 하는 경우도 있을 수 있습니다. 플레이어와 UI 의 상호작용 방식을 결정하는 데 사용되는 노드가 몇 가지 있는데, 아래에서 보듯이 Set Input Mode 입니다.
- 위에서 왼쪽 노드 Set Input Mode Game and UI 는, 이름과 같은 작업을 하며, 플레이어가 입력은 물론 UI 를 통해서도 게임 조작을 할 수 있게 됩니다 (예를 들어 화면상에서 캐릭터를 제어하는 것 뿐만 아닌, 특정 버튼이나 UI 요소 클릭에도 접근 가능합니다).
- 위에서 가운데 노드 Set Input Mode Game Only 는, 게임에 대한 입력만 가능하고 UI 요소는 무시합니다 (생명력, 점수, 시간 표시처럼 비상호작용형 UI 요소에 좋습니다).
- 위에서 오른쪽 노드 Set Input Mode UIOnly 는 특수한 경우에 대비한 것으로, 게임 입력이 아닌 UI 조작만 가능하도록 하는 경우에 쓰입니다. 이는 모든 게임 조작을 비활성화시키고 UI 가 모든 입력을 소모하게 합니다. 이 노드는 신중히 사용하세요.
위의 노드에 추가로, 마우스 커서 표시를 켜고/끌 수 있으면 좋습니다. 그럴 때 Set Show Mouse Cursor 노드를 사용하면 됩니다. Get Player Controller 노드를 끌어 놓은 다음 Set Show Mouse Cursor 노드를 사용하여 True 또는 False 체크를 하면 마우스 커서를 표시 또는 숨깁니다.
위젯에 위젯 추가하기
다른 위젯에 위젯을 추가하려면 부모-자손 관계를 만들어 두 번째 위젯을 첫 번째 위젯 아래 중첩시켜 놓습니다. 그 방법은, 단순히 자손 위젯을 부모 위젯에 덧붙이면 됩니다. Add to Viewport 함수를 사용할 필요는 없습니다.
위 예제는 start_Button 이라는 Scroll Box 위젯을, Add Child 함수를 사용하여 Main Menu 라는 새 위젯에 덧붙이는 방법을 보여줍니다.
TSubclassOf<>
TSubclassOf<>
TSubclassOf<>는 클래스를 디자인 시간에 결정하고, Blueprint와의 상호 작용, 타입 안정성을 향상시키는 데 유용합니다.
이러한 UPROPERTY 안전성에 추가로, C++ 수준에서의 유형 안전성도 확보할 수 있습니다. 비호환 TSubclassOf 유형을 서로에게 할당하려는 순간, 컴파일 오류가 나게 됩니다. 범용 UClass 를 할당하려는 경우, 할당이 가능한지 검증하는 실행시간 검사를 합니다. 실행시간 검사가 실패하면, 결과값은 nullptr 입니다.
UClass* ClassA = UDamageType::StaticClass();
TSubclassOf<UDamageType> ClassB;
ClassB = ClassA; // Performs a runtime check
TSubclassOf<UDamageType_Lava> ClassC;
ClassB = ClassC; // Performs a compile time check
UClass::StaticClass
특정 클래스의 UClass 객체를 반환합니다. UClass 객체는 Unreal Engine의 Reflection 시스템에서 해당 클래스의 메타데이터를 나타냅니다. 이 메소드는 주로 Reflection, Serialization, 그리고 Blueprint와의 상호 작용에 사용됩니다.
References
Module | CoreUObject |
Header | /Engine/Source/Runtime/CoreUObject/Public/UObject/Class.h |
Include | #include "UObject/Class.h" |
Syntax : static UClass * StaticClass()
기능 및 사용법
- 클래스 메타데이터 접근: ::StaticClass()는 클래스 자체의 정보를 나타내는 UClass 객체를 반환합니다. 이 객체는 클래스의 프로퍼티, 함수, 인터페이스 등의 메타데이터를 포함합니다.
- Reflection 지원: Unreal Engine의 Reflection 시스템은 게임 엔진이 실행 시간(runtime)에 객체의 타입과 멤버를 검사하고 조작할 수 있게 해줍니다. ::StaticClass()는 이 시스템의 핵심 부분입니다.
- Blueprint와의 상호작용: Blueprint에서 C++ 클래스를 참조하거나 생성할 때, ::StaticClass() 메소드를 사용하여 해당 클래스의 정보를 얻습니다.
예제 사용법
UClass* MyClass = AMyActor::StaticClass();
이 코드는 AMyActor 클래스의 UClass 객체를 MyClass 변수에 할당합니다.
주의사항
- 클래스당 하나의 인스턴스: StaticClass()는 클래스당 하나의 UClass 인스턴스만을 반환합니다. 즉, 모든 AMyActor 객체는 StaticClass()를 호출했을 때 동일한 UClass 객체를 반환합니다.
- Blueprint와의 호환성: Blueprint에서 C++ 클래스를 사용하기 위해, UClass 객체가 필요합니다. ::StaticClass()는 이러한 상황에서 클래스 정보를 얻는 데 필요합니다.
- 타입 안정성: StaticClass()는 클래스 타입에 대한 안정성을 제공하며, 잘못된 타입의 객체를 생성하거나 참조하는 실수를 방지할 수 있습니다.
::StaticClass() 메소드는 Unreal Engine에서 클래스의 타입 정보를 동적으로 처리하고, Blueprint와 C++ 간의 상호 작용을 용이하게 하는 중요한 역할을 수행합니다.
UGameplayStatics::GetAllActorsOfClass
지정된 클래스 또는 그 서브클래스에 해당하는 모든 액터를 게임 월드에서 찾아내는 데 사용됩니다.
References
Module | Engine |
Header | /Engine/Source/Runtime/Engine/Classes/Kismet/GameplayStatics.h |
Include | #include "Kismet/GameplayStatics.h" |
Source | /Engine/Source/Runtime/Engine/Private/GameplayStatics.cpp |
Syntax
기능 및 사용법
- 액터 검색: 지정된 클래스의 인스턴스 또는 그 서브클래스의 인스턴스를 모두 찾아 배열로 반환합니다.
- 매개변수:
- WorldContextObject: 검색을 수행하는 월드의 컨텍스트를 제공하는 객체입니다.
- ActorClass: 검색할 액터의 클래스입니다. 이 클래스 또는 서브클래스의 인스턴스가 반환됩니다.
- OutActors: 검색 결과를 저장할 액터 배열입니다.
예제 코드
TArray<AActor*> FoundActors;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), AMyActor::StaticClass(), FoundActors);
- 이 예제에서는 GetAllActorsOfClass 함수를 사용하여 게임 월드 내의 모든 AMyActor 인스턴스 (또는 그 서브클래스의 인스턴스)를 찾아 FoundActors 배열에 저장합니다.
주의사항
- 성능 고려: 이 함수는 많은 수의 객체를 검색할 수 있으므로, 게임의 성능에 영향을 줄 수 있습니다. 특히 대규모 월드나 많은 액터가 있는 경우에는 성능 문제를 고려해야 합니다.
- 사용 시점: 게임 월드가 완전히 초기화된 후에 이 함수를 호출해야 합니다. 게임의 초기화 단계에서 호출하면 예상하지 못한 결과를 얻을 수 있습니다.
- 결과 처리: 반환된 액터 배열을 반복 처리하는 로직에서는 각 액터의 유효성을 확인하는 것이 좋습니다.
TArray::Num
Unreal Engine에서 사용되는 메서드로, TArray 컨테이너의 원소 개수를 반환합니다.
Effect to UParticleSystem
UParticleSystem
Unreal Engine에서 파티클 시스템을 표현하는 클래스입니다. 파티클 시스템은 게임과 시각적 효과에서 다양한 형태의 입자 효과를 생성하기 위해 사용됩니다. 이러한 효과에는 폭발, 불꽃, 연기, 먼지, 물방울 등이 포함될 수 있습니다.
References
Module | Engine |
Header | /Engine/Source/Runtime/Engine/Classes/Particles/ParticleSystem.h |
Include | #include "Particles/ParticleSystem.h" |
Syntax : class UParticleSystem : public UFXSystemAsset
기능 및 사용법
- 파티클 효과: UParticleSystem은 복잡한 입자 효과를 정의하는 데 사용됩니다. 각 파티클 시스템은 여러 개의 파티클 에미터(emitters)를 포함할 수 있으며, 각 에미터는 개별적인 입자 효과를 생성합니다.
- 에셋 유형: Unreal Engine에서 UParticleSystem은 에셋으로 관리됩니다. 이는 에디터에서 시각적으로 생성하고 편집할 수 있으며, 게임 내에서 참조하여 사용할 수 있습니다.
- 컴포넌트로 사용: UParticleSystem 자체는 단지 데이터를 정의합니다. 실제 게임 월드에서 효과를 표현하기 위해서는 UParticleSystemComponent를 사용하여 액터에 입자 시스템을 부착해야 합니다.
예제 사용법
// 액터에 파티클 시스템 컴포넌트 추가
UParticleSystemComponent* ParticleSystemComponent = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("MyParticleSystem"));
ParticleSystemComponent->SetTemplate(MyParticleSystemAsset);
이 예제에서 MyParticleSystemAsset은 에디터에서 생성한 UParticleSystem 에셋을 참조합니다. SetTemplate 함수를 사용하여 파티클 시스템 컴포넌트에 이 에셋을 설정합니다.
주의사항
- 에셋 생성 및 편집: 파티클 시스템은 일반적으로 Unreal Engine의 에디터 내에서 시각적으로 생성하고 편집합니다. C++에서는 주로 이미 생성된 에셋을 참조하여 사용합니다.
UGameplayStatics::SpawnEmitterAtLocation
파티클 시스템을 특정 위치에 생성하는 데 사용되는 유틸리티 함수입니다. 이 함수는 주로 시각적 효과, 예를 들어 폭발, 연기, 불꽃, 마법 효과 등을 게임 월드의 특정 위치에서 재생할 때 사용됩니다.
References
Module | Engine |
Header | /Engine/Source/Runtime/Engine/Classes/Kismet/GameplayStatics.h |
Include | #include "Kismet/GameplayStatics.h" |
Source | /Engine/Source/Runtime/Engine/Private/GameplayStatics.cpp |
Syntax
static UParticleSystemComponent * SpawnEmitterAtLocation
(
UWorld * World,
UParticleSystem * EmitterTemplate,
const FTransform & SpawnTransform,
bool bAutoDestroy,
EPSCPoolMethod PoolingMethod,
bool bAutoActivate
)
기능 및 사용법
- 파티클 시스템 생성: 지정된 위치에 파티클 시스템을 생성하고 재생합니다.
- 매개변수:
- WorldContextObject: 함수가 참조할 월드 컨텍스트입니다.
- ParticleSystem: 재생할 UParticleSystem 에셋입니다.
- Location: 파티클 시스템을 생성할 월드 위치입니다.
- Rotation: 파티클 시스템의 회전입니다 (선택적).
- Scale: 파티클 시스템의 크기를 조정합니다 (선택적).
- bNoCollision: 파티클 시스템이 월드의 다른 객체와 충돌하지 않도록 설정할지 여부입니다.
- bAutoDestroy: 파티클 시스템 재생이 끝난 후 자동으로 파괴할지 여부입니다.
예제 코드
UWorld* World = GetWorld();
if (World)
{
UGameplayStatics::SpawnEmitterAtLocation(World, MyParticleSystem, SpawnLocation, SpawnRotation, FVector(1.f, 1.f, 1.f), true, EPSCPoolMethod::AutoRelease);
}
- 이 코드는 MyParticleSystem 파티클 시스템을 SpawnLocation 위치에 SpawnRotation 회전으로 생성하고, 자동으로 파괴되도록 설정합니다.
주의사항
- 에셋 참조: SpawnEmitterAtLocation 함수는 유효한 UParticleSystem 에셋 참조가 필요합니다. 이 에셋은 Unreal Engine의 에디터에서 생성하고 설정합니다.
- 성능 고려: 많은 수의 파티클 시스템이나 복잡한 효과는 성능에 영향을 줄 수 있으므로 주의가 필요합니다.
- 생명주기 관리: bAutoDestroy 매개변수를 true로 설정하면 파티클 시스템이 재생이 끝난 후 자동으로 파괴됩니다. 이를 통해 메모리 관리를 쉽게 할 수 있습니다.
UParticleSystemComponent
Unreal Engine에서 파티클 시스템을 액터에 부착하고 제어하기 위한 컴포넌트입니다.
References
Module | Engine |
Header | /Engine/Source/Runtime/Engine/Classes/Particles/ParticleSystemComponent.h |
Include | #include "Particles/ParticleSystemComponent.h" |
Syntax : class UParticleSystemComponent : public UFXSystemComponent
기능 및 사용법
- 파티클 시스템 부착: UParticleSystemComponent는 UParticleSystem 에셋을 액터에 부착하여 시각적 효과를 생성합니다.
- 동적 제어: 파티클 시스템의 시작, 중지, 재생 및 기타 속성들을 동적으로 제어할 수 있습니다.
- 파티클 이벤트 처리: 파티클 시스템에서 발생하는 다양한 이벤트를 처리할 수 있습니다.
예제 사용법
// 액터의 생성자 또는 초기화 함수 내에서
UParticleSystemComponent* ParticleSystemComp = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("MyParticleSystem"));
ParticleSystemComp->SetTemplate(MyParticleSystemAsset);
- 이 코드는 MyParticleSystemAsset이라는 파티클 시스템 에셋을 사용하여 UParticleSystemComponent를 생성하고 초기화합니다.
- ToonTank에서는 SetupAttachment를 사용하여 Projectile에 붙여주고 언리얼 에디터에서 직접 연결해 주었습니다.
주의사항
- 에셋 필요: UParticleSystemComponent를 사용하려면 먼저 Unreal Engine 에디터에서 파티클 시스템 에셋을 생성하고 설정해야 합니다.
- 성능 고려: 복잡한 파티클 효과는 렌더링 성능에 영향을 줄 수 있으므로, 효과의 복잡도와 게임의 전반적인 성능 사이의 균형을 고려해야 합니다.
- 부착 및 위치: UParticleSystemComponent는 특정 AActor에 부착되며, 부모 액터의 위치, 회전, 크기에 따라 영향을 받습니다.
USoundBase
USoundBase
사운드 관련 기능을 구현하기 위한 기본 클래스입니다. 이 클래스는 모든 사운드 애셋의 베이스 클래스로서, 게임 내에서 재생될 수 있는 모든 종류의 사운드를 나타냅니다. USoundBase는 게임 내에서의 사운드 플레이백과 관련된 기본적인 속성과 기능을 제공합니다.
References
Module | Engine |
Header | /Engine/Source/Runtime/Engine/Classes/Sound/SoundBase.h |
Include | #include "Sound/SoundBase.h" |
Syntax
class USoundBase :
public UObject,
public IInterface_AssetUserData
주요 기능 및 특징
- 다양한 사운드 타입 지원: USoundBase는 일반적인 사운드 트랙, 루프 사운드, 3D 사운드 효과 등 다양한 유형의 사운드를 지원합니다.
- 재생 속성 설정: 사운드의 볼륨, 피치, 공간적 위치 등과 같은 재생 속성을 설정할 수 있습니다. 이를 통해 사운드의 강도나 들리는 방향 등을 조절할 수 있습니다.
- 공간적 사운드 처리: 3D 사운드 시스템을 통해 사운드가 플레이어에게 들리는 방향과 거리를 기반으로 다르게 들리도록 처리할 수 있습니다. 이는 몰입감 있는 오디오 경험을 제공하는 데 중요합니다.
- 사운드 믹싱: 사운드 레벨 및 믹싱 옵션을 통해 다양한 사운드 사이의 균형을 조정할 수 있습니다.
- 사운드 클래스와 믹서: USoundBase는 사운드 클래스와 믹서를 통해 복잡한 사운드 시스템의 일부로 사용될 수 있습니다. 이를 통해 게임 전체에서 일관된 사운드 경험을 제공할 수 있습니다.
사용 예시
언리얼 엔진에서 USoundBase 클래스의 인스턴스는 주로 사운드 애셋으로 구현됩니다. 예를 들어, 게임 내에서 사운드 이펙트를 트리거하거나, 특정 이벤트에 반응하는 사운드를 재생하는 데 사용됩니다.
UGameplayStatics::PlaySoundAtLocation
특정 위치에서 사운드를 재생하는 데 사용됩니다. 이 함수는 3D 공간 내에서 사운드를 재생하며, 사운드가 들리는 위치를 지정할 수 있어서 몰입감 있는 오디오 경험을 제공합니다.
References
Module | Engine |
Header | /Engine/Source/Runtime/Engine/Classes/Kismet/GameplayStatics.h |
Include | #include "Kismet/GameplayStatics.h" |
Source | /Engine/Source/Runtime/Engine/Private/GameplayStatics.cpp |
Syntax
static void PlaySoundAtLocation
(
const UObject * WorldContextObject,
USoundBase * Sound,
FVector Location,
FRotator Rotation,
float VolumeMultiplier,
float PitchMultiplier,
float StartTime,
class USoundAttenuation * AttenuationSettings,
USoundConcurrency * ConcurrencySettings,
AActor * OwningActor
)
기능 및 사용 방법
- 위치 기반 사운드 재생: PlaySoundAtLocation은 인자로 받은 위치에서 사운드를 재생합니다. 이를 통해 사운드의 원천이 되는 위치를 시각적 요소와 정확하게 일치시킬 수 있습니다.
- 사운드 재생 설정: 이 함수는 사운드 애셋 (USoundBase), 재생할 위치, 볼륨, 피치, 시작 시간 등 다양한 매개변수를 설정할 수 있습니다.
예시 코드
UWorld* World = GetWorld();
if (World)
{
FVector Location = ...; // 사운드를 재생할 위치
USoundBase* Sound = ...; // 재생할 사운드 애셋
World->PlaySoundAtLocation(Sound, Location);
}
- 이 코드는 게임 세계(UWorld) 내에서 특정 위치에 사운드를 재생하는 기본적인 사용 예시입니다.
카메라 셰이크
MatineeCameraShake
카메라를 흔드는 효과를 생성하는 데 사용되는 클래스입니다.
References
Module | GameplayCameras |
Header | /Engine/Plugins/Cameras/GameplayCameras/Source/GameplayCameras/Public/MatineeCameraShake.h |
Include | #include "MatineeCameraShake.h" |
Syntax
UCLASS(Blueprintable, HideCategories=(CameraShakePattern))
class UMatineeCameraShake : public UCameraShakeBase
예시 코드
// 카메라 흔들림 클래스 정의
UCLASS()
class UMyCameraShake : public UMatineeCameraShake
{
UMyCameraShake()
{
OscillationDuration = 0.25f;
OscillationBlendInTime = 0.1f;
OscillationBlendOutTime = 0.2f;
RotOscillation.Pitch.Amplitude = FMath::RandRange(5.0f, 10.0f);
RotOscillation.Pitch.Frequency = FMath::RandRange(20.0f, 30.0f);
// 기타 파라미터 설정...
}
};
// 게임 로직 내에서 카메라 흔들림 실행
APlayerController* PC = ...; // 플레이어 컨트롤러 인스턴스
if (PC)
{
PC->ClientStartCameraShake(UMyCameraShake::StaticClass());
}
언리얼 엔진에서 카메라 셰이크는 게임 내에서 시각적인 충격이나 진동 효과를 표현하는 데 사용됩니다. UMatineeCameraShake 클래스는 이러한 효과를 구현하기 위해 사용되며, 특히 언리얼 엔진 4.26 이상 버전에서 사용됩니다. 이전 버전에서는 UCameraShake 클래스가 사용되었습니다.
UMatineeCameraShake의 주요 구성 요소
- Oscillation (진동):
- Oscillation Duration: 진동이 지속되는 시간을 설정합니다.
- Oscillation Blend In Time: 진동이 시작되어 완전히 진행될 때까지의 시간을 설정합니다.
- Oscillation Blend Out Time: 진동이 끝나고 정지될 때까지의 시간을 설정합니다.
- Rot Oscillation과 FOVOscillation:
- 이 두 진동 유형은 플레이어에게 멀미를 유발할 수 있으므로 주의하여 사용해야 합니다.
- Loc Oscillation (위치 진동):
- Amplitude: 진폭을 설정하여 진동의 강도를 조절합니다.
- Frequency: 주파수를 설정하여 진동이 발생하는 빈도를 조절합니다.
버전에 따른 차이
- 4.25 이전 버전:
- UCameraShake 클래스 사용
- 함수: ClientPlayCameraShake()
- 4.26 이상 버전:
- UMatineeCameraShake 클래스 사용
- 함수: ClientStartCameraShake()
사용 예시
// 언리얼 엔진 4.26 이상에서 카메라 셰이크 설정
UPROPERTY(EditAnywhere, Category = "Combat")
TSubclassOf<class UCameraShakeBase> HitCameraShakeClass;
// 플레이어 컨트롤러를 얻어 카메라 셰이크 실행
APlayerController* PC = UWorld::GetFirstPlayerController();
if (PC)
{
PC->ClientStartCameraShake(HitCameraShakeClass);
}
- 이 코드는 플레이어에게 충격이 가해졌을 때 UMatineeCameraShake를 이용하여 카메라 셰이크 효과를 구현하는 예시입니다. 클래스 및 함수는 언리얼 엔진의 버전에 따라 달라질 수 있습니다.
+ 스프링암에 관성을 가지게 하는법
(Spring Arm)Enable Camera Lag (check)
(Spring Arm)Enable Camera Rotation Lag (check)
'Unreal 공부 > UE5 GameDev' 카테고리의 다른 글
[UE5] 향상된 입력 사용하기, Enhanced Input (1) | 2023.12.23 |
---|---|
[심플 슈터][구버전] 158. 캐릭터 이동 기능 (0) | 2023.12.18 |
[UE5] ToonTank (2) (0) | 2023.11.19 |
[UE5] ToonTank (1) (0) | 2023.11.17 |
[UE5][개념편] ToonTank (0) | 2023.11.17 |