アクタをスポーンおよび破壊する

この操作ガイドでは、スポーンするための独自のアクタ、およびボタンをクリックするとアクタをスポーンする aActor Spawner を作成することができます。

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

Blueprints

C++

ビデオゲームではしばしば、プレイヤーは自分のキャラクタ新しいアイテムや武器を手に入れることでエンゲージメントを維持し、時には新しい敵が現れて敗北することもあります。

ゲームの中に、ゲームプレイ中にレベルにアイテムや敵を動的に追加したいと感じる場合があります。これをスポーンといいます。

この操作ガイドでは、ボタンを押した時にアクタ スポナーからスポーンされる Actor クラスを作成します。また、別のボタンを押すとスポーンされたアクタを破壊するロジックを作成します。

image alt text

スポーンするアクタを作成する

このセクションでは、球体コンポーネント、スタティックメッシュ コンポーネント、パーティクル システム コンポーネントを含むアクタを作成します。

  1. スターター コンテンツ を有効にした Third Person Blueprint ゲーム プロジェクトを新規作成します。新しく作成したプロジェクトに SpawnDestroy と名前を付けます。

    image_1.png

  2. コンテンツ ブラウザ から [Add/Import (追加 / インポート)] ボタンを選択して Bp_ActorToSpawn という名前の Blueprint アクタ を新規作成します。

    image_2.png

  3. Class Defaults[Components] タブを開き [Add Component] を選択します。Sphere Component を探して選択し、Scene Component へドラッグして新しい Root Component とします。

    image_3.png

  4. Sphere Component[Details] パネルの ShapeSphere Radius の値を 16.0 にします。

    image_4.png

  5. Physics カテゴリで Simulate Physics 変数の横のボックスにチェックを入れます。

    image_5.png

  6. [Components] タブで Add Component を選択し Static Mesh Component を探して選択します。

    image_6.png

  7. [Details] パネルから Static Mesh カテゴリに移動し、 Static Mesh 変数の横にあるドロップダウン矢印を選択し、Shape_Sphere Static Mesh アセットを探して選択します。

    image_7.png

  8. Transform カテゴリの Scale 変数の X、YZ の値をそれぞれ 0.25、0.25、0.25 に変更します。Location 変数で Z 値を -12.0 に変更します。

    image_8.png

  9. [Components] タブを開き [Add Component] を選択します。Particle System Component を選択します。

    image_9.png

  10. [Details] パネルから Particles カテゴリに移動し、Template 変数の横にあるドロップダウン矢印を選択して P_Fire を検索して選択します。

    image_10.png

  11. ブループリントを コンパイル して 保存** します。

    image_11.png

完成したブループリント

image_12.png

アクタ スポナーを作成する

スポーンするアクタを作成したので、新しい Bp_ActorSpawn アクタをスポーンするためのカスタム機能を使用するアクタ スポナーを作成します。

  1. コンテンツ ブラウザ から [Add/Import (追加 / インポート)] ボタンを選択して Bp_ActorToSpawn という名前の Blueprint アクタ を新規作成します。

    image_13.png

  2. Class Defaults[Components] タブを開き [Add Component] を選択します。Box Component アセットを探して選択し SpawnVolume と名前を付けます。

    image_14.png

  3. イベントグラフ を右クリックして、Actions コンテキスト メニューから Add Custom Event を選択して SpawnActor と名前を付けます。

    image_15.png

  4. Spawn Actor Custom Event 実行ピンを引き出して Executable actions ドロップダウン メニューから Spawn Actor From Class を選択します。

    image_16.png

  5. SpawnActor ノードの Class ピンから BP_ActorToSpawn クラスを選択します。

    image_17.png

  6. Spawn Actor from Class ノードから Spawn Transform ピンを引き出して Actions ドロップダウン メニューから Get Actor Transform を選択します。

    image_18.png

  7. ブループリントを コンパイル して 保存 します。

    image_19.png

完成したブループリント

image_20.png

追加のキャラクター アクション コマンドを設定する

Bp_ActorToSpawn と Bp_ActorSpawner の 2 つのアクタ クラスを作成すると、アクタ スポナーのスポーン アクタ関数を呼び出す機能を備えたサードパーソン キャラクターを設定します。

  1. [Edit] > [Project Settings] > [Engine] > [Input] に移動してから、Bindings カテゴリで Action Mappings カテゴリの隣にある [+] マークをクリックし、SpawnActorsDestroyActors という名前の 2 つのマッピングを追加します。

    image_21.png

  2. SpawnActors アクション キー マッピングを 1 キーに、 DestroyActors アクション キー マッピングを 2 キーに設定します。

    image_22.png

  3. コンテンツ ブラウザ から Third Person Character ブループリントを開いてクラス デフォルトをダブルクリックして イベントグラフ を右クリックします。All Actions for this Blueprint コンテキスト メニューで SpawnActors 入力アクションを探して選択します。

    image_23.png

  4. Pressed 実行ピンを引き出して Executable actions ドロップダウン メニューから Get Actor Of Class ノードを選択します。Actor Class のドロップダウン矢印をクリックして Bp Actor Spawner を選択します。

    image_24.png

  5. Get Actor of Class ノードの Return value pin を引き出します。アクション メニュー 検索で呼び出し関数 Spawn Actor を選択し、Get Actor Of Class ノードから実行ピンを Spawn Actor ノードに接続します。

    image_25.png

  6. イベントグラフ を右クリックして、コンテキスト メニューから DestroyActors 入力アクションイベントを選択します。

    image_26.png

  7. Pressed 実行ピンを引き出して Executable actions ドロップダウン メニューから Get Actor Of Class ノードを選択します。Actor Class のドロップダウン矢印をクリックして Bp Actor to Spawn を選択します。

    image_27.png

  8. Out Actors Return 値ピン実行ピンを引き出してドロップダウン メニューから For Each Loop With Break ノードを選択します。

    image_28.png

  9. Array Element ピンを引き出して アクション メニュー検索で Destroy Actor 関数を選択し、Get All Actors of Class ノードから実行ピンを For Each Loop with Break ノードの 実行ピン に接続します。

  10. For Each Loop with Break ノードから Loop Body 実行ピンを引き出して Destroy Actor 入力実行ピンに接続します。

    image_29.png

  11. コンパイル して 保存 します。

    image_30.png

完成したブループリント

image_31.png

シーンの設定

プレイヤー キャラクターが Bp_Spawner の SpawnActor 関数を呼び出すために必要な機能の作成が完了したので、レベルに Bp_Spawner の場所を選択する必要があります。

  1. コンテンツ ブラウザ から Bp_ActorSpawner のインスタンスをレベルにドラッグします。

    image_32.png

  2. Bp_ActorSpawner をテストするための PIE (Play-In Editor) を選択します。

最終結果

エディタでテストするときに 1 キーを押すと Actor Spawner クラスがレベルにスポーンするためのアクタをスポーンします。2 キーを押すと、レベル内のすべての ActorsToSpawn が破棄されます。

[]!(image_33.gif)(convert:false)

スポーンするアクタを作成する

  1. スターター コンテンツ を有効にした Third Person C++ games project を新規作成します。新しく作成したプロジェクトに SpawnDestroy と名前を付けます。

    image_34.png

  2. C++ Class ウィザードActorToSpawn という名前の Actor クラスを新規作成します。

    image_35.png

  3. ActorToSpawn.h のクラス デフォルトで以下のコードを実行します。

        protected:
    
            UPROPERTY(EditAnywhere, BlueprintReadWrite)
            class USphereComponent* SphereComp;
    
            UPROPERTY(EditAnywhere, BlueprintReadWrite)
            UStaticMeshComponent* StaticMeshComp;
    
            UPROPERTY(EditAnywhere, BlueprintReadWrite)
            class UParticleSystemComponent* ParticleComp;
  4. ActorToSpawn.cpp ファイルに移動して以下のクラス メソッドを宣言します。

        #include "Components/SphereComponent.h"
        #include "Particles/ParticleSystemComponent.h"
  5. AActorToSpawn::AActorToSpawn コンストラクタで以下のコードを実行します。

        AActorToSpawn::AActorToSpawn()
        {
            // 各フレームでこのアクタが Tick() を呼び出すよう設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。
            PrimaryActorTick.bCanEverTick = true;
    
            //デフォルト コンポーネントを作成します
            SphereComp = CreateDefaultSubobject<USphereComponent>(TEXT("Sphere"));
            StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComp"));
            ParticleComp = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("ParticleComp"));
    
            //コンポーネントおよび設定の物理をアタッチします
            SphereComp->SetupAttachment(RootComponent);
            SphereComp->SetSimulatePhysics(true);
            SphereComp->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
    
            StaticMeshComp->AttachToComponent(SphereComp,FAttachmentTransformRules::KeepRelativeTransform);
            ParticleComp->AttachToComponent(StaticMeshComp,FAttachmentTransformRules::KeepRelativeTransform);
    
            //球体の半径を、スタティックメッシュに合わせた小さいサイズに設定します。
            SphereComp->SetSphereRadius(16.0f);
    
            //スタティックメッシュのスケールおよび位置を、球体の半径に合わせて設定します。
            StaticMeshComp->SetRelativeLocation(FVector(0.0, 0.0, -12.0f));
            StaticMeshComp->SetRelativeScale3D(FVector(0.25, 0.25, 0.25));
    
            //コンストラクタ ヘルパーを使用し、球体の形状を備えたスタティックメッシュ コンポーネントを設定します。
            static ConstructorHelpers::FObjectFinder<UStaticMesh>SphereMeshAsset(TEXT("StaticMesh'/Game/StarterContent/Shapes/Shape_Sphere.Shape_Sphere'"));
            StaticMeshComp->SetStaticMesh(SphereMeshAsset.Object);
    
            //コンストラクタ ヘルパーを使用し、発砲パーティクル コンポーネントを備えたパーティクル コンポーネントを設定します。
            static ConstructorHelpers::FObjectFinder<UParticleSystem>ParticleCompAsset(TEXT("ParticleSystem'/Game/StarterContent/Particles/P_Fire.P_Fire'"));
            ParticleComp->SetTemplate(ParticleCompAsset.Object);
        }
  6. このコードを コンパイル します。

  7. エディタで C++ クラス フォルダ へ移動し、ActorToSpawn を右クリックします。コンテキスト メニューから Create Blueprint class based on ActorToSpawn を選択します。

    image_36.png

    完成された Bp_ActorToSpawn は以下の画像のようになります。

    image_37.png

完成コード

ActorToSpawn.h

    #pragma once

    #include "CoreMinimal.h"
    #include "GameFramework/Actor.h"
    #include "ActorToSpawn.generated.h"

    UCLASS()
    class SPAWNDESTROYCPP_API AActorToSpawn : public AActor
    {
        GENERATED_BODY()

    public:
        // このアクタのプロパティのデフォルト値を設定します。
        AActorToSpawn();

    protected:
        // ゲームの開始時またはスポーン時に呼び出します。
        virtual void BeginPlay() override;

        UPROPERTY(EditAnywhere, BlueprintReadWrite)
        class USphereComponent* SphereComp;

        UPROPERTY(EditAnywhere, BlueprintReadWrite)
        UStaticMeshComponent* StaticMeshComp;

        UPROPERTY(EditAnywhere, BlueprintReadWrite)
        class UParticleSystemComponent* ParticleComp;

    public:
        // フレームごとに呼び出します。
        virtual void Tick(float DeltaTime) override;
    };

ActorToSpawn.cpp

    #include "ActorToSpawn.h"
    #include "Components/SphereComponent.h"
    #include "Particles/ParticleSystemComponent.h"

    // デフォルト値を設定します。
    AActorToSpawn::AActorToSpawn()
    {
        // 各フレームでこのアクタが Tick() を呼び出すよう設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。
        PrimaryActorTick.bCanEverTick = true;

        //デフォルト コンポーネントを作成します
        SphereComp = CreateDefaultSubobject<USphereComponent>(TEXT("Sphere"));
        StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComp"));
        ParticleComp = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("ParticleComp"));

        //コンポーネントおよび設定の物理をアタッチします
        SphereComp->SetupAttachment(RootComponent);
        SphereComp->SetSimulatePhysics(true);

        SphereComp->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
        StaticMeshComp->AttachToComponent(SphereComp,FAttachmentTransformRules::KeepRelativeTransform);
        ParticleComp->AttachToComponent(StaticMeshComp,FAttachmentTransformRules::KeepRelativeTransform);

        //球体の半径を、スタティックメッシュに合わせた小さいサイズに設定します。
        SphereComp->SetSphereRadius(16.0f);

        //スタティックメッシュのスケールおよび位置を、球体の半径に合わせて設定します。
        StaticMeshComp->SetRelativeLocation(FVector(0.0, 0.0, -12.0f));
        StaticMeshComp->SetRelativeScale3D(FVector(0.25, 0.25, 0.25));
    }

    // ゲームの開始時またはスポーン時に呼び出します。
    void AActorToSpawn::BeginPlay()
    {
        Super::BeginPlay();

    }

    // フレームごとに呼び出します。
    void AActorToSpawn::Tick(float DeltaTime)
    {
        Super::Tick(DeltaTime);

    }

アクタ スポナーを作成する

スポーンするアクタを作成したので、新しいアクタをスポーンするカスタム機能を使用するアクタ スポナーを作成します。

  1. C++ Class ウィザードActorSpawner という名前の Actor クラスを新規作成します。

    image_38.png

  2. ActorSpawner.h のクラス デフォルトで以下のコードを実行します。

        public:
    
            UFUNCTION()
            void SpawnActor();
    
        protected:
            UPROPERTY(EditAnywhere,BlueprintReadWrite)
            class UBoxComponent* SpawnVolume;
  3. ActorSpawner.cpp へ移動し以下のライブラリをインクルードします。

        #include "Components/BoxComponent.h"
        #include "ActorToSpawn.h"
  4. AActorSpawner::AActorSpawner コンストラクタ内で、以下のコードを実装します。

        AActorSpawner::AActorSpawner()
        {
            RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("DefaultSceneRoot"));
            SpawnVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("SpawnVolume"));
            SpawnVolume->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform);
        }
  5. AActorSpawner::SpawnActor クラス メソッドのための次のコードを実装します。

        void AActorSpawner::SpawnActor()
        {
            FVector SpawnLocation = GetActorLocation();
            FRotator SpawnRotation = GetActorRotation();
    
                GetWorld()->SpawnActor<AActorToSpawn>(SpawnLocation,SpawnRotation);
        }
  6. このコードを コンパイル します。

  7. コンテンツ ブラウザ から「C++ classes フォルダ」に移動し、ActorSpawner クラスを右クリックして、[C++ Class Actions] コンテキスト メニューから Bp_ActorSpawner という名前の Create Blueprint class based on ActorSpawner を選択します。

    image_39.png

    完成したブループリントは、次の画像のようになります。

    image_40.png

完成コード

ActorSpawner.h

    #pragma once

    #include "CoreMinimal.h"
    #include "GameFramework/Actor.h"
    #include "ActorSpawner.generated.h"

    UCLASS()
    class SPAWNDESTROYCPP_API AActorSpawner : public AActor
    {
        GENERATED_BODY()

    public:
        // このアクタのプロパティのデフォルト値を設定します。
        AActorSpawner();

        UFUNCTION()
        void SpawnActor();

    protected:
        // ゲームの開始時またはスポーン時に呼び出します。
        virtual void BeginPlay() override;

        UPROPERTY(EditAnywhere,BlueprintReadWrite)
        class UBoxComponent* SpawnVolume;

    public:
        // フレームごとに呼び出します。
        virtual void Tick(float DeltaTime) override;
    };

ActorSpawner.cpp

    #include "ActorSpawner.h"
    #include "Components/BoxComponent.h"
    #include "ActorToSpawn.h"

    // デフォルト値を設定します。
    AActorSpawner::AActorSpawner()
    {
        // 各フレームでこのアクタが Tick() を呼び出すよう設定します。必要ない場合は、パフォーマンス向上のためにこれをオフにすることができます。
        PrimaryActorTick.bCanEverTick = true;

        RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("DefaultSceneRoot"));
        SpawnVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("SpawnVolume"));

        SpawnVolume->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform);
    }

    // ゲームの開始時またはスポーン時に呼び出します。
    void AActorSpawner::BeginPlay()
    {
        Super::BeginPlay();
    }

    void AActorSpawner::SpawnActor()
    {
        FVector SpawnLocation = GetActorLocation();
        FRotator SpawnRotation = GetActorRotation();
        GetWorld()->SpawnActor<AActorToSpawn>(SpawnLocation,SpawnRotation);
    }

    // フレームごとに呼び出します。
    void AActorSpawner::Tick(float DeltaTime)
    {
        Super::Tick(DeltaTime);
    }

追加のキャラクター アクション コマンドを設定する

アクタ クラスとアクタ スポナー クラスの両方を設定したら、アクタ スポナーのスポーン アクタ関数を呼び出す機能を備えたサードパーソン キャラクターを設定します。また、プレイヤーにアクタ スポナーのスポーン アクタ関数を呼び出す機能を提供するために、プレイヤー キャラクターの入力キーマッピングをマッピングする必要があります。

  1. [Edit (編集)] > [Project Settings (プロジェクト設定)] > [Engine (エンジン)] > [Input (入力)] に移動してから、[Bindings (バインディング)] > [Action (アクション)] マッピング カテゴリで [+] ボタン をクリックし、「SpawnActors」および「DestroyActors」という名前の 2 つのマッピングをさらに追加します。

    image_41.png

  2. SpawnActors アクション キー マッピングを 1 キーに、DestroyActors アクション キー マッピングを 2 キーに設定します。

    image_42.png

  3. ThirdPersonCharacter.h ファイルを開き、以下のクラスを宣言します。

        protected:
            void SpawnActors();
            void DestroyActors();
  4. ThirdPersonCharacter.cpp へ移動し以下のライブラリをインクルードします。

        #include "Kismet/GameplayStatics.h"
        #include "ActorSpawner.h"
        #include "ActorToSpawn.h"

    GameplayStatics には、Blueprint と C ++ の両方から呼び出すことができる便利なゲームプレイ ユーティリティ関数が含まれています。詳細については、API ドキュメントの「GameplayStatics」を参照してください。

  5. ASpawnDestroyCppCharacter::SpawnActors メソッドと ASpawnDestroyCppCharacter::DestroyActors メソッドに次のクラス定義を実装します。

        void ASpawnDestroyCppCharacter::SpawnActors()
        {
            //ワールド内でアクタ スポナーを見つけ、その Spawn Actor 関数を呼び出します。
            AActor* ActorSpawnerTofind = UGameplayStatics::GetActorOfClass(GetWorld(),AActorSpawner::StaticClass());
    
            AActorSpawner* ActorSpawnerReference = Cast<AActorSpawner>(ActorSpawnerTofind);
            if (ActorSpawnerReference)
            {
                ActorSpawnerReference->SpawnActor();
            }
        }
    
        void ASpawnDestroyCppCharacter::DestroyActors()
        {
            //ワールド内ですべてのアクタをスポーンさせ、Destroy アクタを呼び出します。
            TArray<AActor*> FoundActors;
            UGameplayStatics::GetAllActorsOfClass(GetWorld(), AActorToSpawn::StaticClass(), FoundActors);
            for (AActor* ActorFound :FoundActors)
            {
                ActorFound->Destroy();
            }
        }
  6. ASpawnDestroyCppCharacter::SetupPlayerInputComponent に移動し、次のコードを追加します。

        void ASpawnDestroyCppCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
        {
            PlayerInputComponent->BindAction("SpawnActors", IE_Pressed, this, &ASpawnDestroyCppCharacter::SpawnActors);
            PlayerInputComponent->BindAction("DestroyActors", IE_Pressed, this, &ASpawnDestroyCppCharacter::DestroyActors);
        }

    完成コード

SpawnDestroyCppCharacter.h

    #pragma once

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

    UCLASS(config=Game)
    class ASpawnDestroyCppCharacter : 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:
        ASpawnDestroyCppCharacter();

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

        /** 基本ルックアップ/ダウン レート (度/秒)。最終的なレート (率) が他のスケーリングの影響を受ける場合があります。*/
        UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera)
        float BaseLookUpRate;

    protected:
        /*アクタ スポナーをレベル内に呼び出し、アクタをスポーンします*/
        void SpawnActors();

        /*すべての ActorToSpawn アクタを取得し、Destroy 関数を呼び出します*/
        void DestroyActors();

        /** VR での HMD の向きをリセットします。*/
        void OnResetVR();

        /** 前方/後方入力のために呼び出されます。*/
        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; }
    };

SpawnDestroyCppCharacter.cpp

    #include "SpawnDestroyCppCharacter.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 "Kismet/GameplayStatics.h"
    #include "ActorSpawner.h"
    #include "ActorToSpawn.h"
    //////////////////////////////////////////////////////////////////////////
    // ASpawnDestroyCppCharacter

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

        // 入力のターン率を設定します。
        BaseTurnRate = 45.f;
        BaseLookUpRate = 45.f;

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

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

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

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

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

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

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

        PlayerInputComponent->BindAction("SpawnActors", IE_Pressed, this, &ASpawnDestroyCppCharacter::SpawnActors);
        PlayerInputComponent->BindAction("DestroyActors", IE_Pressed, this, &ASpawnDestroyCppCharacter::DestroyActors);
        PlayerInputComponent->BindAxis("MoveForward", this, &ASpawnDestroyCppCharacter::MoveForward);
        PlayerInputComponent->BindAxis("MoveRight", this, &ASpawnDestroyCppCharacter::MoveRight);

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

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

        // VR ヘッドセットの機能
        PlayerInputComponent->BindAction("ResetVR", IE_Pressed, this, &ASpawnDestroyCppCharacter::OnResetVR);
    }

    void ASpawnDestroyCppCharacter::SpawnActors()
    {

        //レベル内でアクタ スポナーを見つけ、その Spawn Actor 関数を呼び出します。
        AActor* ActorSpawnerTofind = UGameplayStatics::GetActorOfClass(GetWorld(),AActorSpawner::StaticClass());
        AActorSpawner* ActorSpawnerReference = Cast<AActorSpawner>(ActorSpawnerTofind);

        if (ActorSpawnerReference)
        {
            ActorSpawnerReference->SpawnActor();
        }
    }

    void ASpawnDestroyCppCharacter::DestroyActors()
    {
        TArray<AActor*> FoundActors;
        UGameplayStatics::GetAllActorsOfClass(GetWorld(), AActorToSpawn::StaticClass(), FoundActors);
        for (AActor* ActorFound :FoundActors)
        {
            ActorFound->Destroy();
        }
    }

    void ASpawnDestroyCppCharacter::OnResetVR()
    {
        // SpawnDestroyCpp が Unreal Editor の [Add Feature (機能を追加)] からプロジェクトに追加される場合、SpawnDestroyCpp.Build.cs の依存関係は自動的に反映されず、
        // リンカのエラーが発生します。
        // 以下のいずれかを行う必要があります。
        //      正常にビルドを行うために「HeadMountedDisplay」を [YourProject].Build.cs PublicDependencyModuleNames に追加します (VR をサポートしている場合に適切)。
        // または:
        //      以下の ResetOrientationAndPosition への呼び出しをコメントにするか、または削除します (VR をサポートしていない場合に適切)
        UHeadMountedDisplayFunctionLibrary::ResetOrientationAndPosition();
    }

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

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

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

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

    void ASpawnDestroyCppCharacter::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 ASpawnDestroyCppCharacter::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);
        }
    }

シーンの設定

プレイヤー キャラクターが Bp_Spawner の SpawnActor 関数を呼び出すために必要な機能の作成が完了したので、レベルに Bp_Spawner の場所を設定する必要があります。

  1. コンテンツ ブラウザ から Bp_ Spawner のインスタンスをレベルにドラッグします。

    image_43.png

  2. PIE (Play-In Editor) を選択してスポナーをテストします。

最終結果

エディタでテストするときに 1 キーを押すと Actor Spawner クラスがレベルにスポーンするためのアクタをスポーンします。2 キーを押すと、レベル内のすべての ActorsToSpawn が破棄されます。

image_44.gif

タグ
このページは Unreal Engine の前のバージョン用です。現在リリースされている Unreal Engine 5.3 に対して更新は行われていません。
Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル