일반적으로 많이 사용하는 Actor나 ActorComponent가 아니라, 간혹 Object를 바로 상속받거나 LocalPlayerSubsystem 같은 클래스를 상속받은 BP 클래스를 만들어서 사용해야 할 때가 있다. 그런데, 그렇게 상속받은 클래스에서 BlueprintFunctionLibrary에 정의된 함수를 호출하려고 하면 잘 안된다. 에디터에서 마우스 오른쪽을 눌러 다른 BP 함수 라이브러리의 함수를 찾아도 아예 보이지가 않는다.

 

정확한 원인은 잘 모르겠지만, BlueprintFunctionLibrary 함수를 호출할 때는 호출하려는 클래스의 GetWorld 함수 접근이 필요한데, Actor나 ActorComponent의 경우 해당 함수가 에디터에서도 접근할 수 있게 노출되어 있지만, UObject나 Subsystem 계통의 클래스들은 그게 안되어 있어서 생긴 문제로 보인다.

 

그래서, BP 클래스를 만들기 전에 부모 클래스를 c++로 만들고, Blueprintable 속성을 넣어주고, GetWorld 함수를 오버라이드하면 해결이 된다.

// MyGameSoundSubsystem.h
UCLASS(Blueprintable)
class MYGAME_API UMyGameSoundSubsystem : public ULocalPlayerSubsystem
{
    GENERATED_BODY()

public:
    virtual UWorld* GetWorld() const override;
//...
};
  
  
// MyGameSoundSubsystem.cpp
UWorld* UMyGameSoundSubsystem::GetWorld() const
{
#if WITH_EDITOR
    if (IsTemplate())
    {
        return nullptr;
    }
#endif

    return Super::GetWorld();
}

가장 간단한 방법은 위의 코드처럼 cpp 함수의 구현부에서 그냥 부모 함수만 호출해도 되긴 하는데, 에디터에서는 뭔가 또 다르게 작동하는 게 있어서 예외처리는 필요하다.

 

항상 위의 코드처럼 작성해야 하는 건 아니고 경우에 따라서는 부모 클래스나 Outer 클래스를 참조해야 할 필요도 있고, WorldContext를 명시적으로 노출해서 사용해야 하는 경우도 있다.

 

코드 출처: https://forums.unrealengine.com/t/can-you-use-a-blueprint-function-library-in-an-object-class/350918/31

 

ps. 일반적으로 Actor나 ActorComponent는 현재 맵(Level)의 월드에 귀속되지만, UObject를 상속받은 클래스 혹은 Subsystem 클래스들은 싱글턴처럼 쓰이는 경우가 많고, 현재 월드가 아닌 다른 월드(엔진 기본 월드?)에 귀속되어 있을 수 있다.

윈도우즈 운영체제에서는 윈도우 애플리케이션이 정상 작동 중인지 확인하기 위해서, 지속적으로 윈도우 메시지를 해당 애플리케이션으로 보내는데, 만약 일정 시간이 지나도 응답이 없으면, 해당 애플리케이션이 응답이 없으니 (강제로) 종료하겠느냐는 팝업을 띄운다. 그런데, 게임 등의 애플리케이션을 개발하다 보면 로딩해야 될 리소스가 많아서 시간이 오래 걸릴 경우가 있는데, 그렇게 로딩하는 와중에 이 팝업이 뜨면 유저는 해당 애플리케이션에 문제가 있다고 생각하고 강제 종료를 하게 될 수 있다. 해결 방법은 크게 두 가지이다.

 

1. 로딩 처리를 시간이 많이 드는 부분, 특히 파일 로딩을 비동기로 처리해서 메인 스레드에서 윈도우 메시지 처리가 끊기지 않게 하기.

 

2. 응답 없음 처리(고스팅 처리) 기능을 그냥 끄는 방법

 

1번이 바람직한 방법이긴 하지만, 프로그램 구조를 바꿔야 하고, 바꾸는 와중에 버그가 발생하기도 하고, 암튼 좀 어려울 수 있다. 2번 방식은 그냥 다음의 함수를 한번 호출해 주면 된다.

DisableProcessWindowsGhosting();

링크: https://learn.microsoft.com/ko-kr/windows/win32/api/winuser/nf-winuser-disableprocesswindowsghosting

 

DisableProcessWindowsGhosting 함수(winuser.h) - Win32 apps

호출 GUI 프로세스에 대한 창 고스팅 기능을 사용하지 않도록 설정합니다. 창 고스팅은 사용자가 응답하지 않는 애플리케이션의 주 창을 최소화, 이동 또는 닫을 수 있는 Windows 관리자 기능입니

learn.microsoft.com

참고로, 해당 기능을 다시 켜는 함수는 없다.

+ Recent posts