본문 바로가기

언리얼 + cpp

언리얼 C++ (Reflection, Delegate)

Reflection

리플렉션은 런타임 중에 자기 자신을 조사하는 기능을 뜻한다. C#에도 있다.

가비지 컬렉션, 리플리케이션, 시리얼라이즈 등의 기능들의 근간을 이룬다.

리플렉션은 언리얼 오브젝트만 가질 수 있다. 일반 C++ 클래스는 불가능 하다.

언리얼 오브젝트 클래스의 멤버 변수나 멤버 함수에 UPROPERTY()나 UFUNCTION()을 작성하고 필요한 키워드들도 작성하면 가능해진다. 또한 모든 언리얼 오브젝트 개체는 자기 자신 클래스가 가진 속성과 함수 정보를 컴파일 타임(StaticClass())과 런타임(GetClass())에서 조회할 수 있다.

// SXGameInstance.h

class SHOOTERX_API USXGameInstance : public UGameInstance
{
	...
	
public:
	...

protected:
	UPROPERTY()
	FString Name;

};

// SXGameInstance.cpp

USXGameInstance::USXGameInstance()
{
    Name = TEXT("SXGameInstance's Class Default Object");
        // CDO의 Name 속성에 저장됨.
        // 중단점을 걸어보면 언리얼 에디터가 실행되기 전에 호출됨을 알 수 있음.
}

void USXGameInstance::Init()
{
    Super::Init();

    UClass* CompiletimeClassInfo = StaticClass();
    UClass* RuntimeClassInfo = GetClass();

    checkf(CompiletimeClassInfo != RuntimeClassInfo, TEXT("CompiletimeClassInfo != RuntimeClassInfo"));
	// 둘은 같을까 다를까?

    UE_LOG(LogTemp, Log, TEXT("CompiletimeClassInfo->GetName(): %s"), *CompiletimeClassInfo->GetName());
    UE_LOG(LogTemp, Log, TEXT("RuntimeClassInfo->GetName(): %s"), *RuntimeClassInfo->GetName());

    Name = TEXT("SXGameInstance's Object");

    UE_LOG(LogTemp, Log, TEXT("USXGameInstance::Name %s"), *(RuntimeClassInfo->GetDefaultObject<USXGameInstance>()->Name));
    UE_LOG(LogTemp, Log, TEXT("USXGameInstance::Name %s"), *Name);
}

Delegate

Delegate는 발행 구독 패턴을 가지고 있다.

발행 구독 패턴이란 발행자와 구독자, 그 사이에 중개인이 있는 패턴을 말한다.

발행자와 구독자는 서로 몰라도 중개인을 통해 컨텐츠를 생산하고 소비할 수 있다.

발행 구독 패턴의 장점

1. 의존성이 작다.

2. 발행자는 중개인과 통신만 잘 연결하면 끝. 구독자까지 신경 쓸 필요가 없다.

3. 구독자 또한 중개인과 통신만 잘 연결하면 끝. 문제가 생겨도 서로 영향이 없다.

이는 유지보수가 쉽다는 것을 뜻한다.

발행 구독 패턴의 단점

서로 반대 쪽의 상황을 알 수가 없다. 무슨 일이 벌어지는지 파악할 수가 없다.

언리얼에서의 발행 구독 패턴

델리게이트는 발행자를 위한 Broadcast() 함수와 구독자를 위한 Add() 함수를 제공한다.

컨텐츠를 구독하기 위해 구독자는 Add() 함수를 호출하고 컨텐츠가 생산되면 발행자는 Broadcast() 함수를 호출한다.

언리얼 델리게이트 선언 매크로
DECLARE_(델리게이트 유형)_DELEGATE_{바인드 될 함수 명세}(...)

델리게이트 유형

델리게이트 유형은 전달 방식과 프로그래밍 언어에 따라 결정된다.

1:1 전달인지 1:N 전달인지, C++에서만 사용할 것인지 C++과 블루프린트에서 사용할 것인지.

바인드 될 함수 명세

바인드 될 함수 명세는 매개변수의 개수와 반환값의 유무에 따라 결정된다.

매개변수가 몇개인지, 함수의 반환값이 있는지 없는지.

알림 함수

1:1 델리게이트 : Execute()

1:N 델리게이트 : Broadcast()

델리게이트 바인드 함수

 

델리게이트를 어느상황에서 쓰면 좋은지 잘 이해가 안돼서 찾아보니델리게이트 변수를 선언하고 특정 함수에서 Broadcast(알림)를 발생시키면, 그 델리게이트를 구독(AddUObject)해놓은 함수가 자동으로 호출된다. 라고 한다.

 

아직 어떻게 사용이 될지는 딱 떠오르진 않지만 아주 유용한 기능인것같다.