UE のレベルでは、GameMode、GameState、プレイヤー キャラクター (DefaultPawn)、PlayerController、PlayerState などがすべて必須のコンポーネントです。これらの各ユニットの機能は次のとおりです。
- GameMode はレベル全体のコントローラーであり、レベル全体のビジネス ロジックを記述するために使用されます。
- GameState はレベル全体の状態であり、レベル全体のゲーム データを保存するために使用されます。
- DefaultPawn はプレイヤー キャラクターであり、ロールプレイング ゲームの場合はゲーム シーンに表示されるキャラクター エンティティです。
- PlayerController はプレーヤーのコントローラーであり、プレーヤーに関連する制御ロジックを記述するために使用されます。
- PlayerState はプレーヤーの状態であり、プレーヤーに関連するステータス データを保存するために使用されます。
以下ではGameModeとDefaultPawnを例に、これらのコンポーネントユニットの設定と取得について紹介します。
1. GameModeの設定と取得
1.1 ゲームモード設定
C++ またはブループリントで AGameModeBase から継承したクラスを作成した後、WorldSettings インターフェイスでカスタマイズした GameMode を選択することで、特定のレベルの GameMode の設定が完了します。
図 1、GameMode 設定
1.2 GameModeの取得
特定のレベルに属する GameMode は、UGameplayStatics::GetGameMode() を通じて取得できます。使用例は次のとおりです (ACylindricalWall がアクター)。まず GetGameMode() を通じて AGameModeBase を取得し、それをカスタマイズした AGodGameMode に変換します。
void ACylindricalWall::MonitorPlayer()
{
// 获取GameMode
auto GameMode = Cast<AGodGameMode>(UGameplayStatics::GetGameMode(this));
// ...
}
GetGameMode()のソースコード実装は以下の通りで、まずWorldを取得し、次にWorldからGameModeを取得します。
AGameModeBase* UGameplayStatics::GetGameMode(const UObject* WorldContextObject)
{
UWorld* const World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull);
return World ? World->GetAuthGameMode() : NULL;
}
2. プレイヤーキャラクターの設定と取得
2.1 プレイヤーキャラクターの設定
2.1.1 WorldSettings インターフェースでプレイヤーキャラクターを設定する
以下の図に示すように、プレイヤー キャラクターの DefaultPawn の設定も GameMode と同様に WorldSettings インターフェイス上で完了できます。ただし、WorldSettings インターフェイスで設定するこの方法は、選択した GameMode がブループリント クラスの場合にのみ適用されます。GameMode が C++ クラスの場合、DefaultPawnClass のドロップダウン ボックスの操作は無効になります。
図 2、DefaultPawn の設定
2.1.2 GameModeでのプレイヤーキャラクターの設定
WorldSettings インターフェイスで選択した GameMode クラスが C++ クラスで、WorldSettings インターフェイスで DefaultPawnClass を選択できないという問題を解決するために、GameMode クラスでプレイヤー キャラクターを設定できます。設定方法は以下の通り、GameModeのコンストラクター内でDefaultPawnClassに直接値を代入することでプレイヤーキャラクターの設定が完了します。また、PlayerControllerClassに値を代入することで、プレイヤーコントローラーを直接設定することもできます。
AGodGameMode::AGodGameMode()
{
// set default pawn class to our Blueprinted character
static ConstructorHelpers::FClassFinder<APawn> PlayerPawnBPClass(TEXT("/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter"));
if (PlayerPawnBPClass.Class != NULL)
{
// 设置玩家角色
DefaultPawnClass = PlayerPawnBPClass.Class;
PlayerControllerClass = AGodPlayerController::StaticClass();
}
}
2.1 プレイヤーキャラクターの入手
特定のレベルに属するプレイヤー キャラクターは、UGameplayStatics::GetPlayerPawn() を通じて取得できます。その使用例は次のとおりで、ACylindricalWall が Actor である場合、まず GetPlayerPawn() を通じて APawn を取得し、それをカスタム AGodCharacter に変換します。
void ACylindricalWall::MonitorPlayer()
{
// 获取玩家角色
auto Player = Cast<AGodCharacter>(UGameplayStatics::GetPlayerPawn(GetWorld(), 0));
// ...
}
GetPlayerPawn()のソースコード実装は以下の通りで、まずPlayerControllerを取得し、次にPlayerControllerがPawnを取得します。
APawn* UGameplayStatics::GetPlayerPawn(const UObject* WorldContextObject, int32 PlayerIndex)
{
APlayerController* PC = GetPlayerController(WorldContextObject, PlayerIndex);
return PC ? PC->GetPawnOrSpectator() : nullptr;
}
プレイヤーキャラクターがCharacterの場合は、GetPlayerPawn()の代わりにGetPlayerCharacter()を使用することもできます。