プレイヤー キャラクターをリスポーンする

Unreal Engine でプレイヤー キャラクターをリスポーンするためのチュートリアルです。

ゲーム プロジェクトでは、ゲームプレイ中に破壊されたプレイヤー キャラクターをワールドに復活させたい場合があります。

この操作ガイドでは、シングル プレイヤー用の複製されたものではないゲーム用に、サードパーソンテンプレートを使用した簡単なリスポーン システムをセットアップする方法を学習します。その後で、サードパーソンプレイヤーキャラクターがレベルにリスポーンするためのゲームモード クラスの機能を実装する必要があります。

実装方法を選んでください。

Blueprints

C++

プロジェクトのセットアップ

まず最初は、[Project Settings (プロジェクト設定)] から サードパーソン テンプレート を新規作成し、入力マッピングを設定します。この入力マッピングは、プレイヤー キャラクター用に作成するリスポーン機能を有効にします。

  1. [Games (ゲーム)] > [Third Person (サードパーソン)] > [Blueprint] の順に選択して、RespawnPlayer という名前のプロジェクトを作成します。

    画像をクリックして拡大表示します。

  2. [Edit] > [Project Settings] > [Engine] > [Input] に移動してから、 [Details] パネルの Bindings カテゴリで Action Mappings 変数の隣にある Add [+] ボタンをクリックし、Restart という名前のアクション マッピングを作成します。

    画像をクリックして拡大表示します。

  3. Restart のアクション マッピング キー値を R に設定します。

    画像をクリックして拡大表示します。

RespawnPlayerGameMode クラスを実装する

この例では、ゲームプレイ中に破壊された場合、GameMode クラスがプレイヤー キャラクター クラスのリスポーンを行います。イベント ディスパッチャー を使ってこの機能を実装する必要があります。

  1. コンテンツ ブラウザ で、[Content] > [ThirdPersonBP] > [Blueprints] を選択し、ThirdPersonGameMode ブループリントをダブルクリックして Class Defaults を開きます。

    04_OpenBP_ThirdPersonGM.png

  2. Class Defaults で Open Full Blueprint Editor リンクを クリック します。

    05_OpenFullBPEditor.png

    1. [My Blueprint] パネルから Event Dispatchers カテゴリへ移動し [Add (+)] ボタンをクリックして OnPlayerDied という名前の イベント ディスパッチャー を作成します。

    06_AddEventDispatcher.png

  3. [Details] パネルの Inputs カテゴリで Add (+) ボタンをクリックし、Blueprint クラス タイプのキャラクターの 新規 Input パラメータ を作成して Character と名前をつけます。

    07_AdjustOnPlayerDied.png

  4. イベント グラフ を 右クリック して Actions メニューを表示して Event BeginPlay を探して検索します。

    Copy Node Graph

    08_BPScript01.png

  5. Begin Play ノードから 実行ピン を引き出して、Actions メニューで Bind Event On Player Died ノードを探して選択します。

    Copy Node Graph

    09_BPScript02.png

  1. Bind Event to On Player Died ノードから イベント ピンを引き出して、Actions メニューで Add Custom Event ノードを探して選択して、このカスタム イベントに PlayerDied と名前をつけます。

    Copy Node Graph

    10_BPScript03.png

    別の ブループリント から呼び出す目的で、イベント を作成し カスタム イベント に結合します。

    これにより、イベントが別のブループリントで発行されると、このブループリントのイベントがトリガーされます。たとえば、ThirdPersonCharacter Blueprint クラスから OnDestroy イベントがトリガーされます。これを イベント ディスパッチャー と呼びます。

    詳細については、「イベント ディスパッチャー」と「イベント ディスパッチャー クイックスタート」を参照してください。

  2. PlayerDied Custom Event ノードから Character ピンを引き出して Actions ドロップダウン メニューから Get Controller ノードを選択します。

    Copy Node Graph

    11_BPScript04.png

  3. PlayerDied ノードから 実行ピン を引き出して、Actions メニューで Restart Player ノードを探して選択します。

    Copy Node Graph

    12_BPScript05.png

  4. Get Controller ノードから Return Value ピンを引き出して、 RestartPlayer ノードの New Player 入力ピンに接続します。

    13_BPScript06.png v

    RestartPlayer は、GameModeBase クラスにすでに存在するメソッドです。FindPlayerStart によって返される場所でプレイヤーのポーンをスポーンしようとします。

  5. [Compile (コンパイル)][Save (保存)] を順にクリックします。

    14_CompileSaveButton.png

完成したブループリント

Copy Node Graph

15_BPScriptFinal1.png

RespawnPlayerCharacter クラスを実装する

RespawnPlayerCharacter を破壊し GameMode の RestartPlayer メソッドを呼び出すためのロジックを実装します。

  1. コンテンツ ブラウザ で、[Content] > [ThirdPersonBP] を選択し、hirdPersonCharacter をダブルクリックして Class Defaults を開きます。

    16_OpenBPThirdPersonCharacter.png

  2. [My Blueprint] パネルから Functions カテゴリへ移動し [Override] ボタンをクリックします。ドロップダウンから Destroyed Override Function を選択します。

    17_OverrideFunction.png

    Functions カテゴリで [Override] ボタンを選択すると、キャラクター各関数はキャラクターがオーバーライドを継承するクラスを一覧表示します。Character クラスは Actor から継承されるので、独自の Destroyed 関数を含む Destroyed イベント が一覧表示されます。

  3. アクション メニューから Event Destroyed を引き出して、Cast to Third Person Game Mode を検索して選択します。

    Copy Node Graph

    18_BPScript07.png

  4. Cast to Third Person Game Mode ノードから Object ピンを引き出して、Get Game Mode ノードを検索して選択します。

    Copy Node Graph

    19_BPScript08.png

  5. Third Person Game Mode ノードから As Third Person Game mode ピンを引き出して、Call On Player Died イベント ディスパッチャーを検索して選択します。

    Copy Node Graph

    20_BPScript09.png

  6. Call On Player Died ノードから Character ピンを引き出して Actions ドロップダウン メニューから Get a reference to self ノードを選択します。

    Copy Node Graph

    21_BPScript10.png

  7. [My Blueprint] パネルから Functions カテゴリへ移動し [Add (+)] ボタンをクリックして Call Restart Player という名前の新規関数を作成します。

    22_AddFunction.png

  8. Call Restart Player をダブルクリックして Local Variables カテゴリに移り、[Add (+)] ボタンをクリックして新しいローカル変数タイプの Controller を作成して ControllerRef と名付けます。

    23_AddLocalVariables.png

  9. ControllerRef 変数を Call Restart Player ノードの 実行ピン にドラッグします。

    Copy Node Graph

    24_BPScript11.png

  10. ControllerRef ピンを引き出して Actions ドロップダウン メニューから Pawn category カテゴリの Get Controller を選択します。

    Copy Node Graph

    25_BPScript12.png

  11. Set ControllerRef ノードに戻って アクション メニューから 実行ピン を引き出して、DestroyActor を探して選択します。

    Copy Node Graph

    26_BPScript13.png

  12. Destroy Actor から実行ピンを引き出して、アクション メニューから Event Destroyed を引き出して、Cast to Third Person Game を検索して選択します。

    Copy Node Graph

    27_BPScript14.png

  13. Cast to Third Person Game Mode ノードから Object ピンを引き出して、Get Game Mode ノードを検索して選択します。

    Copy Node Graph

    28_BPScript15.png

  14. Third Person Game Mode ノードから As Third Person Game mode ノードを引き出して、RestartPlayer を検索して選択します。

    Copy Node Graph

    29_BPScript16.png

  15. [My Blueprint] パネルの Local Variables カテゴリで ControllerRefRestart Player ノードの New Player ピンにコピーします。

    Copy Node Graph

    30_BPScript17.png

  16. [Compile (コンパイル)][Save (保存)] を順にクリックします。

    31_CompileSaveButton.png

    完成した Call Restart Player 関数は次のように表示されます。

    Copy Node Graph

    32_BPScriptFinal2.png

  17. イベントグラフ を開いて右クリックして、Restart 入力アクションイベントを選択します。

    33_BPScript18.png

  18. Pressed key ピン を引き出して、Actions メニューで Call Restart Player ノードを探して選択します。

    Copy Node Graph

    34_BPScript19.png

    R キーが押されると、プレイヤー キャラクターを破壊する Call Restart Player 関数がトリガーされます。Destroy メソッドは通常、プレイヤーが Gameplay イベントで十分なヘルス値を失い、プレイヤーをデスポーンしたときにトリガーされます。

  19. [Compile][Save] を順にクリックします。

    35_CompileSaveButton.png

完成したブループリント

Copy Node Graph

36_BPScriptFinal3.png

最終結果

エディタに戻って Play in Editor (PIE) をクリックします。 W、A、S、D のそれぞれのキーを使って、マップ内でのキャラクターの移動を制御できます。

R キーを押すと、プレイヤー キャラクターは瞬間的に消えて Player Start Location でリスポーンされます。

プロジェクトの設定

まず最初は、[Project Settings (プロジェクト設定)] から サードパーソン テンプレート を新規作成し、入力マッピングを設定します。この入力マッピングは、プレイヤー キャラクター用に作成するリスポーン機能を有効にします。

  1. [Games (ゲーム)] > [Third Person (サードパーソン)] > [C++] プロジェクト の順に選択して、「RespawnPlayer」という名前の新規プロジェクトを作成します。

    クリックしてフルサイズで表示

  2. [Edit] > [Project Settings] > [Engine] > [Input] に移動してから、[Details] パネルの Bindings カテゴリで Action Mappings 変数の隣にある [+Add (+追加)] ボタンをクリックし、Restart という名前のアクション マッピングを作成します。

    クリックしてフルサイズで表示

  3. Restart のアクション マッピング キー値を R に設定します。

    クリックしてフルサイズで表示

RespawnPlayerGameMode クラスを実装する

この例では、ゲームプレイ中にプレイヤー キャラクターが破壊された場合、GameMode クラスがプレイヤー キャラクター クラスのリスポーンを行います。デリゲート を使ってこの機能を実装する必要があります。

  1. コンテンツ ブラウザ から、C++ Classes フォルダに移動し、RespawnPlayerGameMode をダブルクリックして「RespawnPlayerGameMode.h」を開きます。

    04_CppOpenRespawnPlayerGM.png

  2. RespawnPlayerGameMode.h」ファイルで、ライブラリ インクルード宣言で以下のコードを宣言します。

        DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPlayerDiedSignature, ACharacter*, Character);

    このアクションは、プレイヤー キャラクターが死んだときにバインドするゲームモード クラスの動的な マルチキャスト デリゲート FOnPlayerDiedSignature を作成します。

  3. 次に、以下のクラスを宣言します。

        public:
            const FOnPlayerDiedSignature& GetOnPlayerDied() const { return OnPlayerDied; }
    
            //プレイヤーのポーンのスポーンを試行します。
            virtual void RestartPlayer(AController* NewPlayer) override;
    
        protected:
            virtual void BeginPlay() override;
    
            //プレイヤー キャラクターが死んだときに呼び出されます。
            UFUNCTION()
            virtual void PlayerDied(ACharacter* Character);
    
            //デリゲートをバインドするためのシグネチャ
            UPROPERTY()
            FOnPlayerDiedSignature OnPlayerDied;

    RestartPlayer は GameModeBase クラスにすでに存在しているメソッドです。FindPlayerStart によって返される位置でプレイヤーのポーンのスポーンを試みます。

  4. RespawnPlayerGameMode.cpp」ファイルに移動して以下のクラス メソッドを宣言します。

        void ARespawnPlayerGameMode::BeginPlay()
        {
            Super::BeginPlay();
    
            //プレイヤーが死んだときのデリゲートを、ゲームモードの PlayerDied 関数にバインドします。
            if (!OnPlayerDied.IsBound())
            {
                OnPlayerDied.AddDynamic(this, &ARespawnPlayerGameMode::PlayerDied);
            }
        }
    
        void ARespawnPlayerGameMode::RestartPlayer(AController* NewPlayer)
        {
            Super::RestartPlayer(NewPlayer);
        }
    
        void ARespawnPlayerGameMode::PlayerDied(ACharacter* Character)
        {
            //キャラクターのプレイヤー コントローラーへの参照を取得します。
            AController* CharacterController = Character->GetController();
            RestartPlayer(CharacterController);
        }
  5. コードをコンパイルします。

完成コード

RespawnPlayerGameMode.h

    // Copyright Epic Games, Inc. All Rights Reserved.
    #pragma once

    #include "CoreMinimal.h"
    #include "GameFramework/GameModeBase.h"
    #include "RespawnPlayerGameMode.generated.h"

    DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPlayerDiedSignature, ACharacter*, Character);

    UCLASS(minimalapi)
    class ARespawnPlayerGameMode : public AGameModeBase
    {
        GENERATED_BODY()

    public:

        ARespawnPlayerGameMode();

        const FOnPlayerDiedSignature& GetOnPlayerDied() const { return OnPlayerDied; }

        //プレイヤーのポーンのスポーンを試行します。
        virtual void RestartPlayer(AController* NewPlayer) override;

    protected:

        virtual void BeginPlay() override;

        //プレイヤー キャラクターが死んだときに呼び出されます。
        UFUNCTION()
        virtual void PlayerDied(ACharacter* Character);

        //デリゲートをバインドするためのシグネチャ
        UPROPERTY()
        FOnPlayerDiedSignature OnPlayerDied;
    };

RespawnPlayerGameMode.cpp

    #include "RespawnPlayerGameMode.h"
    #include "RespawnPlayerCharacter.h"
    #include "UObject/ConstructorHelpers.h"

    ARespawnPlayerGameMode::ARespawnPlayerGameMode()
    {
        // デフォルトのポーン クラスをブループリント化したキャラクターに設定します
        static ConstructorHelpers::FClassFinder<APawn> PlayerPawnBPClass(TEXT("/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter"));
        if (PlayerPawnBPClass.Class != NULL)
        {
            DefaultPawnClass = PlayerPawnBPClass.Class;
        }
    }

    void ARespawnPlayerGameMode::BeginPlay()
    {
        Super::BeginPlay();

        //プレイヤーが死んだときのデリゲートを、ゲームモードの PlayerDied 関数にバインドします。
        if (!OnPlayerDied.IsBound())
        {
            OnPlayerDied.AddDynamic(this, &ARespawnPlayerGameMode::PlayerDied);
        }
    }

    void ARespawnPlayerGameMode::RestartPlayer(AController* NewPlayer)
    {
        Super::RestartPlayer(NewPlayer);
    }

    void ARespawnPlayerGameMode::PlayerDied(ACharacter* Character)
    {
        //キャラクターのプレイヤー コントローラーへの参照を取得します。
        AController* CharacterController = Character->GetController();
        RestartPlayer(CharacterController);
    }

RespawnPlayerCharacter を実装する

これで、RespawnPlayerCharacter を破棄するために使用されるロジックを実装し、RespawnPlayerGameMode's クラスを使ってリスポーンを実装するタスクが実行されます。

  1. コンテンツ ブラウザ から、C++ Classes フォルダに移動し、RespawnPlayerCharacter をダブルクリックして「RespawnPlayerCharacter.h」ファイルを開きます。

    05_CppOpenRespawnPlayerCh.png

  2. RespawnPlayerCharacter.h ファイルで以下のコードを宣言します。

        protected:
    
            //ゲームプレイ中にアクタが破壊されたら呼び出されます。
            virtual void Destroyed();
    
            //Restart Player Character にゲームモード クラスを呼び出します。
            void CallRestartPlayer();

    この宣言では、Destroyed メソッドは virtual でマークされています。それは、Character クラスはActor クラスから継承を行っており、これには自身の破壊されたメソッドを含んできます。

  3. RespawnPlayerCharacter.cpp」ファイルに移動し、次のクラス ライブラリ インクルードを宣言します。

        #include "RespawnPlayerGameMode.h"

    後に Player Character クラスからクラス機能を呼び出すために、Gamemode ライブラリ宣言をインクルードします。

  4. 次に、以下の RespawnPlayerCharacter クラス メソッドを追加します。

        void ARespawnPlayerCharacter::Destroyed()
        {
            Super::Destroyed();
    
            // GameMode の OnPlayerDied イベントにバインドするための例
            if (UWorld* World = GetWorld())
            {
                if (ARespawnPlayerGameMode* GameMode = Cast<ARespawnPlayerGameMode>(World->GetAuthGameMode()))
                {
                    GameMode->GetOnPlayerDied().Broadcast(this);
                }
            }
        }
    
        void ARespawnPlayerCharacter::CallRestartPlayer()
        {
            //ポーン コントローラーへの参照を取得します。
            AController* CortollerRef = GetController();
    
            //プレイヤーを破壊します。
            Destroy();
    
            //ワールド内に World および GameMode を取得し、プレイヤーをリスタートするための関数を呼び出します。
            if (UWorld* World = GetWorld())
            {
                if (ARespawnPlayerGameMode* GameMode = Cast<ARespawnPlayerGameMode>(World->GetAuthGameMode()))
                {
                    GameMode->RestartPlayer(CortollerRef);
                }
            }
        }

    CallRestartPlayer 関数はプレイヤー キャラクターを破壊し、R キーが押されたときに呼び出されます。Destroy メソッドは通常、Gameplay イベントによってプレイヤーの体力が十分に失われ、プレイヤー キャラクターがデスポーンしたときに呼び出されます。

  5. SetupPlayerInputComponent メソッドに移動し、以下のコードを宣言します。

        void ARespawnPlayerCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
        {
            //Restart Player を呼び出すための入力キー アクションを設定します。
            PlayerInputComponent->BindAction("Restart", IE_Pressed, this, &ARespawnPlayerCharacter::CallRestartPlayer);
        }
  6. コードをコンパイルします。

完成コード

RespawnPlayerCharacter.h

    // Copyright Epic Games, Inc. All Rights Reserved.

    #pragma once

    #include "CoreMinimal.h"
    #include "GameFramework/Character.h"
    #include "RespawnPlayerCharacter.generated.h"

    UCLASS(config=Game)
    class ARespawnPlayerCharacter : public ACharacter
    {
        GENERATED_BODY()

        /** キャラクターの後ろにカメラを配置するカメラ ブーム*/
        UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
        class USpringArmComponent* CameraBoom;

        /** カメラをフォローします。*/
        UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
        class UCameraComponent* FollowCamera;

    public:

        ARespawnPlayerCharacter();

        /** 基本回転速度 (度/秒)。最終的なターン率が他のスケーリングの影響を受ける場合があります。*/
        UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Input)
        float TurnRateGamepad;

    protected:

        /** 前方/後方入力のために呼び出されます。*/
        void MoveForward(float Value);

        /** 左右の入力のために呼び出されます。*/
        void MoveRight(float Value);

        /**
         * 任意の率でターンするよう、入力を介して呼び出されます。
         * @param Rate  これは正規化された率で、「1.0」は希望のターン率を 100% 実現していることを意味します。
         */
        void TurnAtRate(float Rate);

        /**
         * 任意の率でルックアップ/ルックダウンをターンするよう、入力を介して呼び出されます。
         * @param Rate  これは正規化された率で、「1.0」は希望のターン率を 100% 実現していることを意味します。
         */
        void LookUpAtRate(float Rate);

        /** タッチ入力が開始されたときのハンドラ。*/
        void TouchStarted(ETouchIndex::Type FingerIndex, FVector Location);

        /** タッチ入力が停止したときのハンドラ。*/
        void TouchStopped(ETouchIndex::Type FingerIndex, FVector Location);

    protected:

        // APawn インターフェース
        virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
        // APawn インターフェースの終了

    public:

        /** CameraBoom サブオブジェクトを返します。**/
        FORCEINLINE class USpringArmComponent* GetCameraBoom() const { return CameraBoom; }

        /** FollowCamera サブオブジェクトを返します。**/
        FORCEINLINE class UCameraComponent* GetFollowCamera() const { return FollowCamera; }

    protected:

        //ゲームプレイ中にアクタが破壊されたら呼び出されます。
        virtual void Destroyed();

        //Restart Player Character にゲームモード クラスを呼び出します。
        void CallRestartPlayer();
    };

RespawnPlayer.cpp

    // Copyright Epic Games, Inc. All Rights Reserved.

    #include "RespawnPlayerTestCharacter.h"
    #include "HeadMountedDisplayFunctionLibrary.h"
    #include "Camera/CameraComponent.h"
    #include "Components/CapsuleComponent.h"
    #include "Components/InputComponent.h"
    #include "GameFramework/CharacterMovementComponent.h"
    #include "GameFramework/Controller.h"
    #include "GameFramework/SpringArmComponent.h"
    #include "RespawnPlayerTestGameMode.h"

    //////////////////////////////////////////////////////////////////////////
    // ARespawnPlayerCharacter

    ARespawnPlayerCharacter::ARespawnPlayerCharacter()
    {
        // コリジョン カプセルのサイズを設定します。
        GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f);

        // 入力向けのターン率を設定します。
        TurnRateGamepad = 50.f;

        // コントローラーが回転するときは回転させないでください。影響を受けるのはカメラのみにします。
        bUseControllerRotationPitch = false;
        bUseControllerRotationYaw = false;
        bUseControllerRotationRoll = false;

        // キャラクターの動きを設定します。
        GetCharacterMovement()->bOrientRotationToMovement = true; // 入力した方向にキャラクターが移動します...
        GetCharacterMovement()->RotationRate = FRotator(0.0f, 500.0f, 0.0f); // ...この回転速度で実行します。

        // 注:これらの変数のイテレーションをさらに高速化する場合などは、再コンパイルして調整するのではなく、キャラクターの
        // ブループリントで微調整できます
        GetCharacterMovement()->JumpZVelocity = 700.f;
        GetCharacterMovement()->AirControl = 0.35f;
        GetCharacterMovement()->MaxWalkSpeed = 500.f;
        GetCharacterMovement()->MinAnalogWalkSpeed = 20.f;
        GetCharacterMovement()->BrakingDecelerationWalking = 2000.f;

        // カメラ ブームを作成します (コリジョンがある場合はプレイヤーに向かって引きます)。
        CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
        CameraBoom->SetupAttachment(RootComponent);
        CameraBoom->TargetArmLength = 400.0f; // カメラがキャラクターの後ろをこの距離で追跡します。
        CameraBoom->bUsePawnControlRotation = true; // コントローラーを基準にアームを回転させます。

        // 追跡するカメラを作成します。
        FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
        FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); // ブームの最後にカメラをアタッチして、コントローラーの方向と一致するようブーム自身に調整させます。
        FollowCamera->bUsePawnControlRotation = false; // カメラは腕の動きに合わせて回転しません。

        // 注:メッシュ コンポーネント上のスケルタルメッシュと Anim ブループリントの参照 (キャラクターから継承) は、
        // ThirdPersonCharacter という名前の、派生したブループリント アセットで設定されます (C++ での直接のコンテンツ参照を回避するため)
    }

    //////////////////////////////////////////////////////////////////////////
    // 入力

    void ARespawnPlayerCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
    {
        // ゲームプレイ キー バインディングを設定します。
        check(PlayerInputComponent);
        PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
        PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACharacter::StopJumping);

        PlayerInputComponent->BindAxis("Move Forward / Backward", this, &ARespawnPlayerCharacter::MoveForward);
        PlayerInputComponent->BindAxis("Move Right / Left", this, &ARespawnPlayerCharacter::MoveRight);

        // さまざまなデバイスをそれぞれ処理するための回転バインディングには 2 つのバージョンがあります。
        // 「turn」では、マウスなどの絶対デルタを提供するデバイスを処理します。
        // 「turnrate」は、アナログのジョイスティックなど、ユーザーが「変更率」として処理することに決めたデバイス向けです。
        PlayerInputComponent->BindAxis("Turn Right / Left Mouse", this, &APawn::AddControllerYawInput);
        PlayerInputComponent->BindAxis("Turn Right / Left Gamepad", this, &ARespawnPlayerCharacter::TurnAtRate);
        PlayerInputComponent->BindAxis("Look Up / Down Mouse", this, &APawn::AddControllerPitchInput);
        PlayerInputComponent->BindAxis("Look Up / Down Gamepad", this, &ARespawnPlayerCharacter::LookUpAtRate);

        // タッチ デバイスを処理します。
        PlayerInputComponent->BindTouch(IE_Pressed, this, &ARespawnPlayerCharacter::TouchStarted);
        PlayerInputComponent->BindTouch(IE_Released, this, &ARespawnPlayerCharacter::TouchStopped);

        //Restart Player を呼び出すための入力キー アクションを設定します。
        PlayerInputComponent->BindAction("Restart", IE_Pressed, this, &ARespawnPlayerCharacter::CallRestartPlayer);
    }

    void ARespawnPlayerCharacter::TouchStarted(ETouchIndex::Type FingerIndex, FVector Location)
    {
        Jump();
    }

    void ARespawnPlayerCharacter::TouchStopped(ETouchIndex::Type FingerIndex, FVector Location)
    {
        StopJumping();
    }

    void ARespawnPlayerCharacter::TurnAtRate(float Rate)
    {
        // 率に関する情報からこのフレームのデルタを計算します。
        AddControllerYawInput(Rate * TurnRateGamepad * GetWorld()->GetDeltaSeconds());
    }

    void ARespawnPlayerCharacter::LookUpAtRate(float Rate)
    {
        // 率に関する情報からこのフレームのデルタを計算します。
        AddControllerPitchInput(Rate * TurnRateGamepad * GetWorld()->GetDeltaSeconds());
    }

    void ARespawnPlayerCharacter::MoveForward(float Value)
    {
        if ((Controller != nullptr) && (Value != 0.0f))
        {
            // どちらが前方かを調べます。
            const FRotator Rotation = Controller->GetControlRotation();
            const FRotator YawRotation(0, Rotation.Yaw, 0);

            // get forward ベクター
            const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
            AddMovementInput(Direction, Value);
        }
    }

    void ARespawnPlayerCharacter::MoveRight(float Value)
    {
        if ( (Controller != nullptr) && (Value != 0.0f) )
        {
            // どちらが右かを調べます。
            const FRotator Rotation = Controller->GetControlRotation();
            const FRotator YawRotation(0, Rotation.Yaw, 0);

            // get right ベクター
            const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
            // その方向に動きを追加します。
            AddMovementInput(Direction, Value);
        }
    }

    void ARespawnPlayerCharacter::Destroyed()
    {
        Super::Destroyed();

        // GameMode の OnPlayerDied イベントにバインドするための例
        if (UWorld* World = GetWorld())
        {
            if (ARespawnPlayerGameMode* GameMode = Cast<ARespawnPlayerGameMode>(World->GetAuthGameMode()))
            {
                GameMode->GetOnPlayerDied().Broadcast(this);
            }
        }
    }

    void ARespawnPlayerCharacter::CallRestartPlayer()
    {
        //ポーン コントローラーへの参照を取得します。
        AController* CortollerRef = GetController();

        //プレイヤーを破壊します。
        Destroy();

            //ワールド内に World および GameMode を取得し、プレイヤーをリスタートするための関数を呼び出します。
            if (UWorld* World = GetWorld())
            {
                if (ARespawnPlayerGameMode* GameMode = Cast<ARespawnPlayerGameMode>(World->GetAuthGameMode()))
                {
                    GameMode->RestartPlayer(CortollerRef);
                }
            }
    }

最終結果

エディタに戻り、[Play in Editor (プレイ イン エディタ)] (PIE) をクリックします。

これで、WASD キーでキャラクターがマップを動くのをコントロールできるようになりました。

R キーを押すと、Player Start Location でリスポーンされる前に、プレイヤー キャラクターは瞬間的に消えます。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル