C++で自分が作ったポーンが使用されるように設定しようぜ!

前提

はじめに

今回C++でポーンを作成し、ゲーム再生時にそのポーンが配置されるように設定していきます。 どのPawnを生成するかについてはGameModeで設定を行い、どのGameModeを使用するかについてはWorldSettingsで設定を行います。 そのため、今回はPawn、GameMode、WorldSettingsを作成していきます。

Pawn

画面上に配置されるオブジェクトのクラスです。 通常目に見えるようなオブジェクトである場合が多いですが、今回はメッシュの設定を行っていないため、目に見えないポーンオブジェクトになっています。

GameMode

ゲームのルールの定義などを管理するクラスです。 このクラスはデフォルトで生成されているため、今回はそれを使用していきます。

WorldSettings

レベルごとに設定したいパラメータはここで保管します。 「設定」→「ワールド設定」で開く「ワールド設定」タブで表示できます。

クラスの新規作成

それでは、MyPawnクラスの作成とMyWorldSettingsクラスの作成を行います。

MyPawnクラスの作成

コンテンツブラウザでC++クラスを開き、右クリックで「新規C++クラス」を選択

f:id:u16kuma:20160515105332p:plain

MyPawnクラスの親には「ポーン」を選択

f:id:u16kuma:20160515105330p:plain

クラス名に「MyPawn」と入力して「次へ」

f:id:u16kuma:20160515105329p:plain

コンテンツブラウザにMyPawnが表示されていたら成功。 もし表示されていない場合は、UnrealEditorの「ファイル」→「Visual Studio プロジェクトを更新」を押して「再起動」してみてください。

MyWorldSettingsクラスの作成

MyPawnクラスと親クラスの選択以外同様の手順で作成します。 MyWorldSettingsクラスの親クラスにはWorldSettingsクラスを選択(全てのクラスを表示にチェックを入れることで表示される)

作成したMyWorldSettingsを読み込む

作成したMyWorldSettingsクラスは作成しただけではもちろん読み込まれることはありません。

「設定」→「プロジェクト設定」→エンジンの「基本設定」→「Default Classes」→「World Settings Class」のプルダウンメニューから作成した「MyWorldSettings」を選択。

f:id:u16kuma:20160515105337p:plain

以上で設定が完了しましたので、待ちに待ったC++をゴリゴリ書いていきましょう!

C++のコードを打ち込んでいこう!

とりあえず何も考えずに手で打ち込んでいきましょう。 手で入力していくのは非常にめんどくさいのですが、少なからず理解につながるので頑張っていきましょう。

今回作成、変更したソースコード一覧

  • MyPawn.h <新規作成>
  • MyPawn.cpp <新規作成>
  • MyWorldSettings.h <新規作成>
  • MyWorldSettings.cpp <新規作成>
  • SetupEnvGameMode.h <変更>
  • SetupEnvGameMode.cpp <変更>

MyPawn.h

  • デフォルトのコードをそのまま使用
#pragma once

#include "GameFramework/Pawn.h"
#include "MyPawn.generated.h"

UCLASS()
class SETUPENV_API AMyPawn : public APawn
{
    GENERATED_BODY()

public:
    AMyPawn();
    virtual void BeginPlay() override;
    virtual void Tick( float DeltaSeconds ) override;
    virtual void SetupPlayerInputComponent(
        class UInputComponent* InputComponent) override;
};

MyPawn.cpp

  • デフォルトのコードをそのまま使用
#include "SetupEnv.h"
#include "MyPawn.h"

AMyPawn::AMyPawn()
{
    PrimaryActorTick.bCanEverTick = true;
}

void AMyPawn::BeginPlay()
{
    Super::BeginPlay();
}

void AMyPawn::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );
}

void AMyPawn::SetupPlayerInputComponent(
    class UInputComponent* InputComponent)
{
    Super::SetupPlayerInputComponent(InputComponent);
}

MyWorldSettings.h

#pragma once

#include "GameFramework/WorldSettings.h"
#include "MyWorldSettings.generated.h"

UCLASS()
class SETUPENV_API AMyWorldSettings : public AWorldSettings
{
    GENERATED_BODY()
    
    // コンストラクタの宣言を追加
public:
    AMyWorldSettings();
};

MyWorldSettings.cpp

  • GameModeのヘッダファイルのインクルード
  • DefaultGameModeの設定
#include "SetupEnv.h"
#include "MyWorldSettings.h"
#include "SetupEnvGameMode.h"

AMyWorldSettings::AMyWorldSettings()
{
    // 作成したGameModeを設定
    DefaultGameMode = ASetupEnvGameMode::StaticClass();
}

SetupEnvGameMode.h

#pragma once

#include "GameFramework/GameMode.h"
#include "SetupEnvGameMode.generated.h"

UCLASS()
class SETUPENV_API ASetupEnvGameMode : public AGameMode
{
    GENERATED_BODY()
    
    // コンストラクタの宣言を追加
public:
    ASetupEnvGameMode();
    
};

SetupEnvGameMode.cpp

  • 作成したポーンクラスのヘッダファイルを追加
  • DefaultPawnClassの設定
#include "SetupEnv.h"
#include "SetupEnvGameMode.h"

// 作成したポーンクラスのヘッダファイルをインクルード
#include "MyPawn.h"

ASetupEnvGameMode::ASetupEnvGameMode()
{
    // デフォルト値に作成したポーンクラスを設定
    DefaultPawnClass = AMyPawn::StaticClass();
}

ソースコードのポイント

以下の2点で無事作成したポーンクラスが生成されるようになっているはずです。

  • MyWorldSettings.cppのDefaultGameModeにGameModeの型情報を渡している
  • SetupEnvGameMode.cppのDefaultPawnClassにポーンの型情報を渡している

実行してアウトライナを見てみると、無事作成したMyPawnが生成されていることがわかります。

f:id:u16kuma:20160515105328p:plain