본문 바로가기
프로그래밍

👨‍💻 [Unreal] 언리얼 엔진에서 GameplayStatics 오브젝트 는 무엇이며, 어떻게 활용할 수 있나요?

by 밝음의기둥 2024. 12. 31.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

언리얼 엔진에서 GameplayStatics 오브젝트 는 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.


질문 >

언리얼 엔진에서 GameplayStatics 오브젝트 는 무엇이며, 어떻게 활용할 수 있나요?

답변 >

GameplayStatics는 언리얼 엔진에서 제공하는 정적 함수의 모음으로, 게임플레이와 관련된 다양한 유틸리티 기능을 제공합니다. 이 클래스는 전역적으로 사용 가능한 함수들을 포함하고 있어, 객체 인스턴스를 생성하지 않고도 다양한 작업을 간단히 수행할 수 있습니다.


1. GameplayStatics의 특징

  • Static Function의 집합: 모든 함수가 정적(static)으로 정의되어 있어 객체를 생성할 필요 없이 호출 가능합니다.
  • 유용한 기능 제공:
    • 오디오, 스폰, 레벨 관리, 플레이어 관리, 월드 검색 등 게임플레이와 관련된 핵심 작업들을 지원.
  • 다양한 상황에서 활용 가능:
    • 게임 로직 구현, 이벤트 트리거, 디버깅 등에 사용.

2. 주요 기능과 활용 예시

(1) Actor 검색 및 관리

특정 클래스의 액터 검색

게임 내에서 특정 클래스의 액터를 검색하고 조작할 때 사용합니다.

TArray<AActor*> FoundActors;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), AMyActor::StaticClass(), FoundActors);

for (AActor* Actor : FoundActors)
{
    UE_LOG(LogTemp, Warning, TEXT("Found Actor: %s"), *Actor->GetName());
}

  • 용도:
    • 특정 타입의 NPC, 오브젝트 등을 찾기.
    • 게임 로직에서 조건에 따라 액터를 조작.

가장 가까운 액터 검색

AActor* ClosestActor = UGameplayStatics::GetClosestActorOfClass(GetWorld(), AMyActor::StaticClass(), PlayerActor->GetActorLocation());


(2) 스포닝 (Spawning)

액터 스폰

게임 중 특정 위치에 새로운 액터를 생성할 때 사용.

FActorSpawnParameters SpawnParams;
SpawnParams.Owner = this;

AMyActor* SpawnedActor = GetWorld()->SpawnActor<AMyActor>(AMyActor::StaticClass(), SpawnLocation, SpawnRotation, SpawnParams);

GameplayStatics로 액터 스폰

UGameplayStatics::BeginDeferredActorSpawnFromClass를 사용하면 비동기적인 스폰이 가능합니다.

AMyActor* DeferredActor = UGameplayStatics::BeginDeferredActorSpawnFromClass(this, AMyActor::StaticClass(), SpawnTransform);
if (DeferredActor)
{
    // 초기화 작업
    UGameplayStatics::FinishSpawningActor(DeferredActor, SpawnTransform);
}


(3) 사운드 관리

사운드 재생

UGameplayStatics::PlaySoundAtLocation(GetWorld(), MySound, ActorLocation);

사운드 큐에서 재생

USoundCue* MySoundCue = LoadObject<USoundCue>(nullptr, TEXT("/Game/Sounds/MySoundCue.MySoundCue"));
UGameplayStatics::PlaySound2D(GetWorld(), MySoundCue);

  • 용도:
    • 특정 이벤트 발생 시 사운드 재생.
    • 2D/3D 사운드 효과 구현.

(4) 레벨 관리

레벨 변경

UGameplayStatics::OpenLevel(this, FName("NewLevelName"));

  • 용도:
    • 새로운 레벨 로드.
    • 플레이어가 스테이지를 클리어한 후 다음 레벨로 이동.

서브 레벨 관리

UGameplayStatics::LoadStreamLevel(GetWorld(), FName("SubLevelName"), true, true, FLatentActionInfo());

  • 용도:
    • 성능 최적화를 위해 레벨을 스트리밍.

(5) 플레이어 관리

플레이어 컨트롤러 가져오기

APlayerController* PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0);

  • 용도:
    • 플레이어 입력 처리.
    • UI 제어, 카메라 전환.

플레이어 캐릭터 가져오기

ACharacter* PlayerCharacter = UGameplayStatics::GetPlayerCharacter(GetWorld(), 0);

  • 용도:
    • 플레이어 캐릭터의 상태 확인 및 조작.
    • 캐릭터 관련 로직 처리.

(6) 월드 정보 가져오기

월드의 델타 시간

float DeltaSeconds = UGameplayStatics::GetWorldDeltaSeconds(GetWorld());

  • 용도:
    • 시간 기반 동작(애니메이션, 이동) 구현.

현재 레벨 이름 가져오기

FString CurrentLevelName = UGameplayStatics::GetCurrentLevelName(GetWorld());


(7) 효과 및 파티클 재생

특정 위치에서 파티클 재생

UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), MyParticleSystem, SpawnLocation);


3. 장점과 단점

장점

  1. 사용 편의성:
    • 객체 없이 전역적으로 접근 가능.
  2. 다양한 기능 제공:
    • 게임플레이에 필요한 다양한 유틸리티 함수 제공.
  3. 코드 간소화:
    • 일반적으로 사용되는 작업을 간단히 구현 가능.

단점

  1. 추적 어려움:
    • 전역적으로 호출되므로, 함수 사용 위치를 추적하기 어려울 수 있음.
  2. 의존성 증가:
    • GameplayStatics에 지나치게 의존하면 코드 구조가 비효율적이 될 가능성.

4. 베스트 프랙티스

  1. 필요한 경우에만 사용:
    • 복잡한 로직보다는 간단한 작업에 활용.
  2. 대안 고려:
    • 코드 구조가 복잡해질 경우, 특정 클래스나 시스템에서 별도의 함수를 작성해 관리.
  3. 정확한 컨텍스트 제공:
    • GetWorld()와 같은 월드 정보를 정확히 전달.

GameplayStatics는 언리얼 엔진에서 다양한 게임플레이 작업을 간단히 처리할 수 있는 강력한 도구입니다. 특히 전역적으로 액세스해야 하는 유틸리티 함수나 반복적인 작업에 적합하며, 이를 올바르게 활용하면 개발 시간을 단축하고 코드의 가독성을 향상시킬 수 있습니다.



🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형