・前回は、スポーンの「場所」を指定するためのコードをSpawnVolumeクラスに書きました。
・今回は、スポーンする「物」のコードをSpawnVolumeクラスに書いていきます。
〇「何を」スポーンさせるかの機能を追加
SpawnVolume.h
UPROPERTY(EditAnywhere, Category = "Spawning")
TSubclassOf<class APickup> WhatToSpawn;
※完成形

・protected:C++でも、BPでも、子クラスでWhatToSpawnを設定できるようにする。
・TSubclassOf<APickup>:APickupから派生したクラスのみを「リスト」に表示する。(リンク参照)
・APickupが前方宣言されているので、ソース側で、「#include "Pickup.h"」行う。(下図参照)
・UPROPERTY(EditAnywhere, ):SpawnVolumeクラスはBP化しないが、レベルに配置して、WhatToSpawn変数をUEエディタ上で編集できるようにしておく。
Just a moment...

〇ピックアップ物を生成させる関数を追加
SpawnVolume.h
void SpawnPickup();
※完成形
※privateに設定して、他クラスからアクセス不可とする。

〇SpawnPickupの関数定義
SpawnVolume.cpp
・まずは、やるべきことをコメント化する
void ASpawnVolume::SpawnPickup()
{
//①生成物が設定されているか確認
//②GetWorld()の確認・・・GetWorld()->SpawnActor()を使うため
//③SpawnActor()のパラメータに必要なものを用意
//④SpawnActor()の実施
}
①生成物が設定されているか確認
・スポーンさせるものが設定済みかをチェック
//①生成物が設定されているか確認
if (WhatToSpawn != NULL)
{
//②GetWorld()の確認・・・GetWorld()->SpawnActor()を使うため
//③SpawnActor()のパラメータに必要なものを用意
//④SpawnActor()の実施
}
②GetWorld()の確認・・・GetWorld()->SpawnActor()を使うため
void ASpawnVolume::SpawnPickup()
{
//①生成物が設定されているか確認
if (WhatToSpawn != NULL)
{
//②GetWorld()の確認・・・GetWorld()->SpawnActor()を使うため
UWorld* const World = GetWorld();
if (World)
{
//③SpawnActor()のパラメータに必要なものを用意
//④SpawnActor()の実施
}
}
}
③SpawnActor()のパラメータに必要なものを用意
#include "Engine/World.h" //FactorSpawnParameters構造体用
void ASpawnVolume::SpawnPickup()
{
//①生成物が設定されているか確認
if (WhatToSpawn != NULL)
{
//②GetWorld()の確認・・・GetWorld()->SpawnActor()を使うため
UWorld* const World = GetWorld();
if (World)
{
//③SpawnActor()のパラメータに必要なものを用意
FActorSpawnParameters SpawnParams;
SpawnParams.Owner = this; //スポーンされたアクタの所有者
//生成位置
FVector SpawnLocation = GetRandomPointInVolume();
//アイテムの回転
FRotator SpawnRotation;
SpawnRotation.Yaw = FMath::FRand() * 360.0f;
SpawnRotation.Pitch = FMath::FRand() * 360.0f;
SpawnRotation.Roll = FMath::FRand() * 360.0f;
//④SpawnActor()の実施
}
}
}
④SpawnActor()の実施
※生成物は後でパラメータ設定などで使うかもしれないので、変数(SpawnedPickup)に代入している。(使わないかもしれないが)
void ASpawnVolume::SpawnPickup()
{
//①生成物が設定されているか確認
if (WhatToSpawn != NULL)
{
//②GetWorld()の確認・・・GetWorld()->SpawnActor()を使うため
UWorld* const World = GetWorld();
if (World)
{
//③SpawnActor()のパラメータに必要なものを用意
FActorSpawnParameters SpawnParams; //④SpawnActor()の実施
SpawnParams.Owner = this; //スポーンされたアクタの所有者
//生成位置
FVector SpawnLocation = GetRandomPointInVolume();
//アイテムの回転
FRotator SpawnRotation;
SpawnRotation.Yaw = FMath::FRand() * 360.0f;
SpawnRotation.Pitch = FMath::FRand() * 360.0f;
SpawnRotation.Roll = FMath::FRand() * 360.0f;
//④SpawnActor()の実施
APickup* const SpawnedPickup = World->SpawnActor<APickup>(
WhatToSpawn, //生成物
SpawnLocation, //生成位置
SpawnRotation, //生成回転
SpawnParams); //生成パラメータ
}
}
}
※完成形


〇ビルド
・エラーが出なければOKです。
・今回は、スポーンする「物」のコードをSpawnVolumeクラスに書いていきました。
・次回は、スポーンする物を「いつ」生成させるかを実装していきます。
・以上、お疲れ様でした。