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

Unreal Engine でプレイヤー キャラクターをリスポーンするための操作ガイドです。

Windows
MacOS
Linux

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

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

image alt text

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

Blueprints

C++

プロジェクトの設定

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

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

    image alt text

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

    image alt text

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

    image alt text

RespawnPlayerGameMode クラスを実装する

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

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

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

    その他のドキュメントについては、「イベント ディスパッチャー」と「イベント ディスパッチャー クイックスタート」を参照してください。

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

    image alt text

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

    image alt text

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

    image alt text

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

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

    image alt text

完成したブループリント

image alt text

RespawnPlayerCharacter クラスを実装する

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

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

    image alt text

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

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

image alt text

完成したブループリント

image alt text

最終結果

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

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

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

image alt text

プロジェクトの設定

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

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

    image alt text

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

    image alt text

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

    image alt text

RespawnPlayerGameMode クラスを実装する

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

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

    image alt text

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

    DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPlayerDiedSignature, ACharacter*, Character);

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

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

    public:
        const FOnPlayerDiedSignature& GetOnPlayerDied() const { returnOnPlayerDied; }
    
        //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/ThirdPersonCPP/Blueprints/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`を開きます。

    image alt text

  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);
            }
        }
    }
    
    void ARespawnPlayerCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
    {
        //Sets up an input key action to call Restart Player.
        PlayerInputComponent->BindAction("Restart", IE_Pressed, this, &ARespawnPlayerCharacter::CallRestartPlayer);
    }

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

  5. コードを コンパイル します。

完成コード

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=Camera)
    float BaseTurnRate;

    /** Base look up/down rate, in deg/sec. Other scaling may affect final rate. */
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera)
    float BaseLookUpRate;

protected:

    virtual void BeginPlay();
    virtual void Destroyed();
    void CallRestartPlayer();

    /** Resets HMD orientation in VR. */
    void OnResetVR();

    /** 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; }
};

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 rates for input
    BaseTurnRate = 45.f;
    BaseLookUpRate = 45.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, 540.0f, 0.0f); // ...at this rotation rate
    GetCharacterMovement()->JumpZVelocity = 600.f;
    GetCharacterMovement()->AirControl = 0.2f;

    // Create a camera boom (pulls in towards the player if there is a collision)
    CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
    CameraBoom->SetupAttachment(RootComponent);
    CameraBoom->TargetArmLength = 300.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 MyCharacter (to avoid direct content references in C++)
    static ConstructorHelpers::FObjectFinder<USkeletalMesh>SkeletalMeshAsset(TEXT("SkeletalMesh'/Game/Mannequin/Character/Mesh/SK_Mannequin.SK_Mannequin'"));
    GetMesh()->SetSkeletalMesh(SkeletalMeshAsset.Object);
    GetMesh()->SetRelativeLocation(FVector(0.0f, 0.0f, -97.0f));
    GetMesh()->SetRelativeRotation(FQuat(FRotator(0.0f, 270.0f, 0.0f)));
    static ConstructorHelpers::FObjectFinder<UAnimBlueprintGeneratedClass>AnimInstanceAsset(TEXT("AnimBlueprint'/Game/Mannequin/Animations/ThirdPerson_AnimBP.ThirdPerson_AnimBP_C'"));
    GetMesh()->SetAnimInstanceClass(AnimInstanceAsset.Object);
}

//////////////////////////////////////////////////////////////////////////
// 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("MoveForward", this, &ARespawnPlayerCharacter::MoveForward);
    PlayerInputComponent->BindAxis("MoveRight", 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", this, &APawn::AddControllerYawInput);
    PlayerInputComponent->BindAxis("TurnRate", this, &ARespawnPlayerCharacter::TurnAtRate);
    PlayerInputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput);
    PlayerInputComponent->BindAxis("LookUpRate", this, &ARespawnPlayerCharacter::LookUpAtRate);

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

    // VR headset functionality
    PlayerInputComponent->BindAction("ResetVR", IE_Pressed, this, &ARespawnPlayerCharacter::OnResetVR);
    PlayerInputComponent->BindAction("Restart", IE_Pressed, this, &ARespawnPlayerCharacter::CallRestartPlayer);
}

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

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

    // Example to bind to OnPlayerDied event in GameMode. This is _not_ a good idea if this game is multiplayer.
    if (UWorld* World = GetWorld())
    {
        if (ARespawnPlayerGameMode* GameMode = Cast<ARespawnPlayerGameMode>(World->GetAuthGameMode()))
        {
            GameMode->GetOnPlayerDied().Broadcast(this);
        }
    }
}

void ARespawnPlayerCharacter::CallRestartPlayer()
{
    AController* CortollerRef = GetController();
    Destroy();

    if (UWorld* World = GetWorld())
    {
        if (ARespawnPlayerGameMode* GameMode = Cast<ARespawnPlayerGameMode>(World->GetAuthGameMode()))
        {
            GameMode->RestartPlayer(CortollerRef);
        }
    }
}

void ARespawnPlayerCharacter::OnResetVR()
{
    // If RespawnPlayer is added to a project via 'Add Feature' in the Unreal Editor the dependency on HeadMountedDisplay in RespawnPlayer.Build.cs is not automatically propagated
    // and a linker error will result.
    // You will need to either:
    //      Add "HeadMountedDisplay" to [YourProject].Build.cs PublicDependencyModuleNames in order to build successfully (appropriate if supporting VR).
    // or:
    //      Comment or delete the call to ResetOrientationAndPosition below (appropriate if not supporting VR)
    UHeadMountedDisplayFunctionLibrary::ResetOrientationAndPosition();
    CallDestroyPlayer();
}

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 * BaseTurnRate * GetWorld()->GetDeltaSeconds());
}

void ARespawnPlayerCharacter::LookUpAtRate(float Rate)
{
    // calculate delta for this frame from the rate information
    AddControllerPitchInput(Rate * BaseLookUpRate * 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);
    }
}

最終結果

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

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

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

image alt text

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