・前回は、スポーンする「物」のコードをSpawnVolumeクラスに書いていきました。 ・今回は、スポーンする物を「いつ」生成させるかを実装するために、タイマーを使ってスポーン関数を呼び出すようにしていきます。
〇タイマー用の変数とスポーンの遅延変数(電池の落下頻度)の宣言 SpawnVolume.h
FTimerHandle SpawnTimer; //タイマーハンドル UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spawning") float SpawnDelayRangeLow; //最小遅延時間 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spawning") float SpawnDelayRangeHigh; //最大遅延時間
※完成形
・protected・・・派生先でタイマーが使われることを考慮。 ・SpawnTimerはプロパティではないので、UPROPERTYマクロは適用しない。 ・EditAnywhere:レベルエディタ・クラスエディタの詳細パネルで編集可能
〇スポーンの遅延を設定する変数 SpawnVolume.h
float SpawnDelay; //スポーンの遅延情報
※完成形 ・UFUNCTIONマクロは無く、ブループリントで編集できないようにしている。ロジックはC++コードで設定し、派生先のクラスによって変更されないようにしている。
〇コンストラクタで、スポーンの遅延時間を設定 SpawnVolume.cpp
SpawnDelayRangeLow = 1.0f; SpawnDelayRangeHigh = 4.5f;
※完成形 ・1秒~5秒弱の遅れであれば、ピックアップがスポーンしすぎて山積みになることもないし、待たされることもない。
〇BeginPlayで、SetTimer 関数を 使用 して、 タイマー設定を行う SpawnVolume.cpp
SpawnDelay = FMath::FRandRange(SpawnDelayRangeLow, SpawnDelayRangeHigh); // 引数で改行せずに、1行で記述しています。 // GetWorldTimerManager().SetTimer (SpawnTimer, this, &ASpawnVolume::SpawnPickup, SpawnDelay, false); // コメントを記述するために、引数で改行しています。 GetWorldTimerManager().SetTimer ( SpawnTimer, //タイマーハンドル this, //このクラスの関数をCallBackする &ASpawnVolume::SpawnPickup, //デリゲート関数 SpawnDelay , //遅延させる秒数 false); //処理をループさせるか
※完成形
〇SpawnPickup関数でも、タイマーが呼び出される処理を設定(先程の2行をコピー&ペースト) ・BeginPlay関数の中に書いたSetTimerは、ゲーム開始時に1度だけ呼び出されるもの。 ・下図ではBeginPlay関数内の「29,30行目」にあたる2行をコピーしています。
・下図では、SpawnPickup関数内の「73行目の後」にペーストする。 ※ピックアップが実際にスポーンされるコードの後に置く。 ※1個のピックアップをスポーンした後は、タイマーを別のランダムな時間にリセットする。
〇ビルド ・エラーがなければ、UEエディタへ移動
〇作成したSpawnVolumeをレベルに配置 ・今回はC++クラスを直接配置することにします。 ※BP化して、それを配置してもよいです。
〇配置したSpawnVolumeのトランスフォームを変更する ・Rキーでスケールツールに変更し、サイズを大きくする。 ・Wキーで移動ツールに変更し、上空に配置。
〇SpawnVolumeのパラメータ設定 ・「アウトライナー」タブで、SpawnVolumeを選択。 ・「詳細」タブ>スポーンカテゴリ>「WhatToSpawn」:Battery_BPを選択 ・「Spawn Delay Range Low」と「Spawn Delay Range Hight」に、値を設定
【解説】 ・「What to Spawn」のリストに表示されるものについて
〇テストプレイ ・電池がいくつか生成され、落下すればOKです。
〇もう1つSpawnVolumeをレベルに配置 ・Rを押してスケールツールで、縦長の長方形にする。
・詳細タブ>スポーンカテゴリ>WhatToSpawn:「Pickup_BP」 を選択 ・「Spawn Delay Range Low」と「Spawn Delay Range Hight」に値を設定 ※早く生成させるように調整
〇テストプレイ ・「Pickup_BP」は「Simulate Physicsがオフ」なので落下せず、回転だけしています。
〇ここまでで、UEエディタで、SpawnVolumeのプロパティが調整が出来ることが確認出来ました。 ※下図は、2個のSpawnVolumeから、2種類のピックアップが生成された様子。 ※キューブ形状の「Pickup_BP」を生成する「SpawnVolume」は確認のためだけに使ったので、削除しておいてください。
〇「Battery_BP」はこのままでも構いませんが、もう少し電池らしくサイズやマテリアルを適宜変更してみてください。 ・新規にマテリアルを作成(ベースカラーは適当に設定)。
〇Battery_BPのプロパティを変更 ・トランスフォーム>拡大値を調整 ・マテリアルを設定
・「Battery_BP」の変更後のテストプレイの様子。
・今回までで、電池を生成することができるようになりました。 ・次回は、電池を回収する機能を追加していきます。 ・以上、お疲れ様でした。