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

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] > [ThirdPerson] > [Blueprints] を選択し、ThirdPersonGameMode ブループリントをダブルクリックして Class Defaults を開きます。

    04_OpenBP_ThirdPersonGM.png

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

    05_OpenFullBPEditor.png

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

    image alt text

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

    07_AdjustOnPlayerDied.png

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

    Copy Node Graph

    08_BPScript01.png

  6. 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

    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 を選択します。

    image alt text

    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; }
    
        //Tries to Spawn the player's pawn.
        virtual void RestartPlayer(AController* NewPlayer) override;
    
    protected:
        virtual void BeginPlay() override;
    
        //Called when Player character has died.
        UFUNCTION()
        virtual void PlayerDied(ACharacter* Character);
    
        //Signature to bind delegate. 
        UPROPERTY()
        FOnPlayerDiedSignature OnPlayerDied;    

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

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

    void ARespawnPlayerGameMode::BeginPlay()
    {
        Super::BeginPlay();
    
        //Bind our Player died delegate to the Gamemode's PlayerDied function.
        if (!OnPlayerDied.IsBound())
        {
            OnPlayerDied.AddDynamic(this, &ARespawnPlayerGameMode::PlayerDied);
        }
    }
    
    void ARespawnPlayerGameMode::RestartPlayer(AController* NewPlayer)
    {
        Super::RestartPlayer(NewPlayer);
    }
    
    void ARespawnPlayerGameMode::PlayerDied(ACharacter* Character)
    {
        //Get a reference to our Character's Player Controller
        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; }

    //Tries to Spawn the player's pawn.
    virtual void RestartPlayer(AController* NewPlayer) override;

protected:

    virtual void BeginPlay() override;

    //Called when Player character has died.
    UFUNCTION()
    virtual void PlayerDied(ACharacter* Character);

    //Signature to bind delegate. 
    UPROPERTY()
    FOnPlayerDiedSignature OnPlayerDied;
};

RespawnPlayerGameMode.cpp

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

ARespawnPlayerGameMode::ARespawnPlayerGameMode()
{
    // 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;
    }
}

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

    //Bind our Player died delegate to the Gamemode's PlayerDied function.
    if (!OnPlayerDied.IsBound())
    {
        OnPlayerDied.AddDynamic(this, &ARespawnPlayerGameMode::PlayerDied);
    }
}

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

void ARespawnPlayerGameMode::PlayerDied(ACharacter* Character)
{
    //Get a reference to our Character's Player Controller
    AController* CharacterController = Character->GetController();
    RestartPlayer(CharacterController);
}

RespawnPlayerCharacter を実装する

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

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

    05_CppOpenRespawnPlayerCh.png

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

    protected:
    
        //Called when our Actor is destroyed during Gameplay.
        virtual void Destroyed();
    
        //Call Gamemode class to Restart Player Character.
        void CallRestartPlayer();

    Character クラスが独自の destroy メソッドを含む Actor クラスを継承しているため、この宣言では Destroyed メソッドは virtual でマークされています。

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

    #include "RespawnPlayerGameMode.h"

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

  4. RespawnPlayerCharacter クラス メソッドを追加します。

    void ARespawnPlayerCharacter::Destroyed()
    {
        Super::Destroyed();
    
        // Example to bind to OnPlayerDied event in GameMode. 
        if (UWorld* World = GetWorld())
        {
            if (ARespawnPlayerGameMode* GameMode = Cast<ARespawnPlayerGameMode>(World->GetAuthGameMode()))
            {
                GameMode->GetOnPlayerDied().Broadcast(this);
            }
        }
    }
    
    void ARespawnPlayerCharacter::CallRestartPlayer()
    {
        //Get a reference to the Pawn Controller.
        AController* CortollerRef = GetController();
    
        //Destroy the Player.   
        Destroy();
    
        //Get the World and GameMode in the world to invoke its restart player function.
        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)
    {
        //Sets up an input key action to call 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()

    /** Camera boom positioning the camera behind the character */
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
    class USpringArmComponent* CameraBoom;

    /** Follow camera */
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
    class UCameraComponent* FollowCamera;

public:

    ARespawnPlayerCharacter();

    /** Base turn rate, in deg/sec. Other scaling may affect final turn rate. */
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Input)
    float TurnRateGamepad;

protected:

    /** Called for forwards/backward input */
    void MoveForward(float Value);

    /** Called for side to side input */
    void MoveRight(float Value);

    /** 
     * Called via input to turn at a given rate. 
     * @param Rate  This is a normalized rate, i.e. 1.0 means 100% of desired turn rate
     */
    void TurnAtRate(float Rate);

    /**
     * Called via input to turn look up/down at a given rate. 
     * @param Rate  This is a normalized rate, i.e. 1.0 means 100% of desired turn rate
     */
    void LookUpAtRate(float Rate);

    /** Handler for when a touch input begins. */
    void TouchStarted(ETouchIndex::Type FingerIndex, FVector Location);

    /** Handler for when a touch input stops. */
    void TouchStopped(ETouchIndex::Type FingerIndex, FVector Location);

protected:

    // APawn interface
    virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
    // End of APawn interface

public:

    /** Returns CameraBoom subobject **/
    FORCEINLINE class USpringArmComponent* GetCameraBoom() const { return CameraBoom; }

    /** Returns FollowCamera subobject **/
    FORCEINLINE class UCameraComponent* GetFollowCamera() const { return FollowCamera; }

protected:

    //Called when our Actor is destroyed during Gameplay.
    virtual void Destroyed();

    //Call Gamemode class to 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()
{
    // Set size for collision capsule
    GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f);

    // set our turn rate for input
    TurnRateGamepad = 50.f;

    // Don't rotate when the controller rotates. Let that just affect the camera.
    bUseControllerRotationPitch = false;
    bUseControllerRotationYaw = false;
    bUseControllerRotationRoll = false;

    // Configure character movement
    GetCharacterMovement()->bOrientRotationToMovement = true; // Character moves in the direction of input...   
    GetCharacterMovement()->RotationRate = FRotator(0.0f, 500.0f, 0.0f); // ...at this rotation rate

    // Note: For faster iteration times these variables, and many more, can be tweaked in the Character Blueprint
    // instead of recompiling to adjust them
    GetCharacterMovement()->JumpZVelocity = 700.f;
    GetCharacterMovement()->AirControl = 0.35f;
    GetCharacterMovement()->MaxWalkSpeed = 500.f;
    GetCharacterMovement()->MinAnalogWalkSpeed = 20.f;
    GetCharacterMovement()->BrakingDecelerationWalking = 2000.f;

    // Create a camera boom (pulls in towards the player if there is a collision)
    CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
    CameraBoom->SetupAttachment(RootComponent);
    CameraBoom->TargetArmLength = 400.0f; // The camera follows at this distance behind the character   
    CameraBoom->bUsePawnControlRotation = true; // Rotate the arm based on the controller

    // Create a follow camera
    FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
    FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); // Attach the camera to the end of the boom and let the boom adjust to match the controller orientation
    FollowCamera->bUsePawnControlRotation = false; // Camera does not rotate relative to arm

    // Note: The skeletal mesh and anim blueprint references on the Mesh component (inherited from Character) 
    // are set in the derived blueprint asset named ThirdPersonCharacter (to avoid direct content references in C++)
}

//////////////////////////////////////////////////////////////////////////
// Input

void ARespawnPlayerCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{
    // Set up gameplay key bindings
    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);

    // We have 2 versions of the rotation bindings to handle different kinds of devices differently
    // "turn" handles devices that provide an absolute delta, such as a mouse.
    // "turnrate" is for devices that we choose to treat as a rate of change, such as an analog joystick
    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);

    // handle touch devices
    PlayerInputComponent->BindTouch(IE_Pressed, this, &ARespawnPlayerCharacter::TouchStarted);
    PlayerInputComponent->BindTouch(IE_Released, this, &ARespawnPlayerCharacter::TouchStopped);

    //Sets up an input key action to call 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)
{
    // calculate delta for this frame from the rate information
    AddControllerYawInput(Rate * TurnRateGamepad * GetWorld()->GetDeltaSeconds());
}

void ARespawnPlayerCharacter::LookUpAtRate(float Rate)
{
    // calculate delta for this frame from the rate information
    AddControllerPitchInput(Rate * TurnRateGamepad * GetWorld()->GetDeltaSeconds());
}

void ARespawnPlayerCharacter::MoveForward(float Value)
{
    if ((Controller != nullptr) && (Value != 0.0f))
    {
        // find out which way is forward
        const FRotator Rotation = Controller->GetControlRotation();
        const FRotator YawRotation(0, Rotation.Yaw, 0);

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

void ARespawnPlayerCharacter::MoveRight(float Value)
{
    if ( (Controller != nullptr) && (Value != 0.0f) )
    {
        // find out which way is right
        const FRotator Rotation = Controller->GetControlRotation();
        const FRotator YawRotation(0, Rotation.Yaw, 0);

        // get right vector 
        const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
        // add movement in that direction
        AddMovementInput(Direction, Value);
    }
}

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

    // Example to bind to OnPlayerDied event in GameMode. 
    if (UWorld* World = GetWorld())
    {
        if (ARespawnPlayerGameMode* GameMode = Cast<ARespawnPlayerGameMode>(World->GetAuthGameMode()))
        {
            GameMode->GetOnPlayerDied().Broadcast(this);
        }
    }
}

void ARespawnPlayerCharacter::CallRestartPlayer()
{
    //Get a reference to the Pawn Controller.
    AController* CortollerRef = GetController();

    //Destroy the Player.   
    Destroy();

        //Get the World and GameMode in the world to invoke its restart player function.
        if (UWorld* World = GetWorld())
        {
            if (ARespawnPlayerGameMode* GameMode = Cast<ARespawnPlayerGameMode>(World->GetAuthGameMode()))
            {
                GameMode->RestartPlayer(CortollerRef);
            }
        }
}

最終結果

エディタに戻って Play in Editor (PIE) をクリックします。

W、A、S、D のそれぞれのキーを使って、マップ内でのキャラクターの移動を制御できます。

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

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