UE 하위 시스템 연구 노트

UE 하위 시스템

머리말

기사의 내용은 Subsystems 에서 가져왔습니다 . 이 기사는 단지 클라우드 노트일 뿐입니다. 알아보려면 원본 기사를 읽어보세요.

정의:

하위 시스템은 자동으로 인스턴스화되고 릴리스되는 클래스를 정의하기 위한 프레임워크입니다. 이 프레임워크를 사용하면 5가지 범주 중 하나를 선택하여 하위 클래스를 정의할 수 있습니다(C++에서만 정의 가능).

  1. UEngine하위 시스템
    • UEngine* GEngine
  2. UEditor하위 시스템
    • UEditorEngine* GEditor
  3. UGameInstance하위 시스템
    • UGameInstance* GameInstance
  4. UWorld하위 시스템
    • U월드* 월드
  5. ULocalPlayer하위 시스템
    • ULocalPlayer* 로컬 플레이어

이점

  • 자동 인스턴스화
    • 이러한 UMyXXXSubsystem 클래스는 적시에 개체를 생성한 다음 적시에 해제합니다. 이 프로세스는 자동화됩니다. 코드를 직접 만들 필요가 없습니다. 변수를 직접 정의할 필요가 없습니다. Subsystems는 이미 편리하고 친숙한 액세스 인터페이스를 정의했습니다.
  • 호스팅 수명주기
    • 선택한 상위 클래스에 따라 엔진은 생성된 하위 시스템에 대해 서로 다른 수명 주기를 구현합니다. 따라서 공식 문서에서는 이 5개의 상위 클래스를 5개의 서로 다른 수명 주기라고 부릅니다. 선택한 라이프사이클에 따라 적절한 시점에 자동으로 호출됩니다 Initialize(). Deinitialize()필요에 따라 하위 시스템 유형이 자동으로 여러 인스턴스를 생성하는 것도 가능합니다. 복잡한 논리에 대해 걱정할 필요가 없습니다.

사용:

과부하된 함수

virtual bool ShouldCreateSubsystem(UObject* Outer) const override { return true; }
virtual void Initialize(FSubsystemCollectionBase& Collection)override;
virtual void Deinitialize()override;

C++ 액세스

//UMyEngineSubsystem获取
UMyEngineSubsystem* MySubsystem = GEngine->GetEngineSubsystem<UMyEngineSubsystem>();

//UMyEditorSubsystem的获取
UMyEditorSubsystem* MySubsystem = GEditor->GetEditorSubsystem<UMyEditorSubsystem>();

//UMyGameInstanceSubsystem的获取
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(...);
UMyGameInstanceSubsystem* MySubsystem = GameInstance->GetSubsystem<UMyGameInstanceSubsystem>();

//UMyWorldSubsystem的获取
UWorld* World=MyActor->GetWorld();  //world用各种方式也都可以
UMyWorldSubsystem* MySubsystem=World->GetSubsystem<UMyWorldSubsystem>();

//UMyLocalPlayerSubsystem的获取
ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(PlayerController->Player)
UMyLocalPlayerSubsystem * MySubsystem = LocalPlayer->GetSubsystem<UMyLocalPlayerSubsystem>();
//我省略了一些宏标记和注释,因为函数名字是不言自明的。
UCLASS()
class ENGINE_API USubsystemBlueprintLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()
public:
    static UEngineSubsystem* GetEngineSubsystem(TSubclassOf<UEngineSubsystem> Class);
    static UGameInstanceSubsystem* GetGameInstanceSubsystem(UObject* ContextObject, TSubclassOf<UGameInstanceSubsystem> Class);
    static ULocalPlayerSubsystem* GetLocalPlayerSubsystem(UObject* ContextObject, TSubclassOf<ULocalPlayerSubsystem> Class);
    static UWorldSubsystem* GetWorldSubsystem(UObject* ContextObject, TSubclassOf<UWorldSubsystem> Class);
    static ULocalPlayerSubsystem* GetLocalPlayerSubSystemFromPlayerController(APlayerController* PlayerController, TSubclassOf<ULocalPlayerSubsystem> Class);
};

수명주기:

  • UGameInstanceSubsystem: 수량 1. GameInstance의 수명 주기에 따라 게임 시작 시 생성되고 게임 종료 시 소멸됩니다. 여기서 게임은 런타임 모드 또는 PIE 모드에서 실행되는지를 의미합니다. 게임에는 여러 개의 월드 스위치가 생성될 수 있습니다.
  • UWorldSubsystem: 수량은 1보다 클 수 있습니다. UWorld에 따라 다르지만 일반적으로 라이프 사이클은 GameMode와 동일하며 레벨을 전환할 때 파괴되고 생성됩니다. 하지만 에디터 모드의 뷰포트에 있는 장면은 실제로는 월드이고 그 수명 주기는 Editor의 수명 주기와 동일합니다.
  • UEditorSubsystem: 에디터 모드, 수량 1에만 존재합니다. GEditor에 따라 달라지며, 편집기가 시작될 때 생성되고 편집기가 종료되면 소멸됩니다.
  • UEngineSubsystem: GEngine에 따라 다르며, 에디터나 런타임 모드는 전역적으로 고유합니다. 프로세스가 시작될 때 생성되고 프로세스가 종료될 때 소멸됩니다.
  • ULocalPlayerSubsystem: 숫자는 LocalPlayer의 수에 따라 다릅니다. ULocalPlayer에 따라 다르며 일반적으로 수명 주기는 GameInstance와 일치합니다.

UEngineSubsystem과 UEditorSubsystem은 UDynamicSubsystem에 속하며 모듈의 로딩과 릴리즈에 따라 생성 및 소멸될 수 있습니다.

용법:

1. 트래버스

const TArray<USourceControlSubsystem*>& systems= GEngine->GetEngineSubsystemArray<USourceControlSubsystem>();

2. 청사진 상속

C++는 추상 기본 클래스를 생성합니다. –> Blueprint는 추상 기본 클래스를 상속합니다. –> Blueprint 기본 클래스를 명시적으로 로드합니다.

UCLASS(abstract, Blueprintable, BlueprintType)
class HELLO_API UMyGameInstanceSubsystemBase : public UGameInstanceSubsystem
{
}

UObject* bpAsset = LoadObject<UObject>(NULL, TEXT("/Game/BP_MyGameInstanceSubsystem.BP_MyGameInstanceSubsystem_C"));

3. 동일한 BaseType 아래의 여러 하위 시스템은 종속성 순서를 정의할 수 있습니다.

미션 시스템은 점수 시스템에 의존합니다.

void UMyTaskSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
    //初始化依赖项
    Collection.InitializeDependency(UMyScoreSubsystem::StaticClass());
    //获取
    UMyScoreSubsystem* ss=((FSubsystemCollection<UGameInstanceSubsystem>&)Collection).GetSubsystem<UMyScoreSubsystem>(UMyScoreSubsystem::StaticClass());
}

4.틱

UCLASS()
class HELLO_API UMyTickSubsystem : public UGameInstanceSubsystem,public FTickableGameObject
{
    GENERATED_BODY()
public:
    virtual void Tick(float DeltaTime) override;
    virtual bool IsTickable() const override { return !IsTemplate(); }//不是CDO才Tick
    virtual TStatId GetStatId() const override{RETURN_QUICK_DECLARE_CYCLE_STAT(UMyScoreSubsystem, STATGROUP_Tickables);}
};

참고

하위 시스템

추천

출처blog.csdn.net/qq_52179126/article/details/131860744