본문 바로가기
Unreal 게임 개발/Unreal C++ 공부

Unreal StaticClass()

by daisy0461 2024. 10. 3.

StaticClass()

이 함수는 클래스의 UClass 객체를 반환하는 정적 메서드로 주어진 클래스에 대한 정보를 저장한다.

특정 클래스의 인스턴스를 생성할 때 또는 해당 클래스와 관련된 작업을 수행할 때 유용하게 사용된다.

더보기

정적 메서드: 객체 인스턴스와 관련 없이 클래스 자체에 속하는 메서드이다.
객체를 생성하지 않고 호출이 가능하며 보통 클래스의 공통 기능이나 유틸리티 기능을 제공하는데 사용된다.

더보기

Uclass
UClass는 UE에서 클래스를 정의하고 관리하는 시스템.

모든 UObject 파생 클래스(Actor, Component)는 UClass를 통해 인스턴스를 생성하고 조작이 가능하다. 또한 클래스의 구조, 속성, 메서드, 가상 함수, 에디터 노출 등 다양한 메타 정보를 저장한다.

 

StaticClass() 사용 예시

UClass* MyClass = UMyClass::StaticClass();

여기서 MuClass는 UMyClass의 UClass객체를 가리킨다. 

이를 통해 해당 클래스에 대한 정보를 얻을 수 있고 인스턴스를 만들거나 메타 정보도 얻을 수 있다.

 

const FAISenceID SightID = UAISense::GetSenseID(UAISense_Sight::StaticClass());

여기서 UAISense_Sight::StaticClass()는 시각 감각을 나타내는 UClass() 객체를 반환하고 이를 GetSenseID() 함수에 전달해서 시각 감각의 고유한 ID를 얻는다.

 

그럼 이것도 궁금해진다.

UClass는 클래스의 구조, 속성, 메서드 등을 포함하면 직접 메서드를 호출할 수 있는가?

그것은 아니다.

UClass* EnemyClass = AEnemy::StaticClass();
AEnemy* NewEnemy = GetWorld()->SpawnActor<AEnemy>(EnemyClass, SpawnLocation, SpawnRotation);

FString ClassName = EnemyClass->GetName();

UProperty* HealthProperty = EnemyClass->FindPropertyByName("Health");
if (HealthProperty)
{
    if (NewEnemy)
		{
    		NewEnemy->Health = 100;  // Health 속성 설정
		}
}

위 코드처럼 결국 AEnemy::StaticClass();를 사용해도 StaticClass의 return 값은 UClass*이다.

이는 AEnemy의 메타 데이터는 가지고 있지만 AEnemy의 메서드는 직접 호출이 불가능하다.

StaticClass()가 반환하는 UClass는 클래스의 구조, 속성을 설명하는 역할이다.

이 StaticClas를 통해 SpawnActor를 통해 객체를 생성하면 생성된 인스턴스(NewEnemy)를 통해 접근이 가능하다.

 

그리고 EnemyClass->GetName();에서 알 수 있듯 메타정보에 접근하기 위해서는 따로 객체가 필요하지 않다.

 

UProperty* HealthProperty = EnemyClass->FindPropertyByName("Health");의 경우에는 실제로 Health라는 변수가 있는지 찾는다는 의미이다. 이 변수가 public, protected, private 어디 있든 검색을 한다. 하지만 UPROPERTY() 메크로로 선언이 되어있어야 찾을 수 있다.

그리고 if문안을 보면 예상이 되겠지만 실제로 Health 값을 변경하기 위해서는 새로 생성된 인스턴스(NewEnemy)가 필요하다.

 

즉, 진짜 정보! 얘 뭐 있나 뭐냐? 이런걸 알기 위해서 사용하는 것이다.

 

StaticClass()의 중요성

  1. 메타 프로그래밍: UE는 Reflection System을 사용해 클래스에 대한 정보를 동적을 조회가 가능하다.
    이때 StaticClass는 이런 Reflection System의 핵심 부분이다.
  2. UObject 관리: UObject를 상송받은 모든 클래스는 UClass를 통해서 인스턴스화 되어 StaticClass()를 사용하여 객체를 생성하거나 특정 클래스의 메서드를 호출할 수 있다.
  3. Serialization & Editor 통합: UE Editor에서 오브젝트를 관리하고 속성을 Serialize하며 UObject의 데이터를 처리하는데 사용된다.