・前回は、ベースとなるPickupクラスとBatteryPickupクラスで、WasCollected関数を作りました。
・Characterには、CollectionSphereを追加しました。
・今回は回収関数を作ることで、ピックアップ物と相互作用(インタラクト)を出来るようにしていきます。
〇ピックアップ関数
BatteryCollectorCharacter.h
UFUNCTION(BlueprintCallable, Category = "Pickups")
void CollectPickups();
※完成形
・protected・・・このクラスか、派生クラスからのみ呼び出せるようにする。
・Characterに付いているCollectionSphereとオーバーラップしたもの回収する関数
・BlueprintCallable・・・Blueprintからの呼び出しが可能になる。
〇CollectPickups関数の定義
BatteryCollectorCharacter.cpp
#include "Pickup.h"
※完成形
・Pickupクラスを使うことが分かっているので、予め「Pickup.h」をインクルード
・CollectPickups関数は、まずコメントで手順を整理する。
※ピックアップ物(APickup)とオーバラップしたことを検出したいので、それ以外の物(例えば床)とオーバーラップした場合は何も起こらないようにする必要がある。
〇コメントをコーディング化する
//①オーバーラップしたアクタを取得し、配列に入れる
TArray<AActor*> CollectedActors;
CollectionSphere->GetOverlappingActors(CollectedActors);
//②回収したアクタを全て調べる
for (int32 iCollected = 0; iCollected < CollectedActors.Num(); iCollected++)
{
//③アクタをAPickupにCastする
//④Castに成功し、ピックアップが有効かつアクティブなら
//⑤PickupクラスのWasCollected関数を呼ぶ
//⑥ピックアップを非アクティブにする
}
//③アクタをAPickupにCastする
APickup* const TestPickup = Cast<APickup>(CollectedActors[iCollected]);
//④Castに成功し、ピックアップが有効かつアクティブなら
if (TestPickup && !TestPickup->IsPendingKill() && TestPickup->IsActive())
{
//⑤PickupクラスのWasCollected関数を呼ぶ
//⑥ピックアップを非アクティブにする
}
//⑤PickupクラスのWasCollected関数を呼ぶ
TestPickup->WasCollected();
//⑥ピックアップを非アクティブにする
TestPickup->SetActive(false);
〇以上が回収のための流れとなる。
アクタを取得し、配列に保存して、>配列をすべてチェックして、>Pickupかどうかを調べた。>
もしPickupであるならば、有効状態か確かめる。>有効なら回収して、無効化する(ピックアップ物を何度も回収しないようにするため)。
【CollectPickups関数の全体像】
〇ビルド
・エラーがなければUEエディタへ移動
〇最後に、回収と入力をバインドする(キーを押して回収出来るようにする)。
・コンテンツブラウザで、「IA_Jump」を複製>「IA_Collect」とリネーム。
・「IMC_Default」を開く。
・キーマッピングを追加>「Cキー」でコレクト(回収)アクションが呼ばれるようにする。
【VisualStudioに移動】
BatteryCollectorCharacter.h
/** Collect Input Action */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true"))
UInputAction* CollectAction;
※完成形
・/** Jump Input Action */の行を見つけ、下図のようにコピー&ペースト。
・変数名を「CollectAction」に変更。
BatteryCollectorCharacter.cpp
// Collect
EnhancedInputComponent->BindAction(CollectAction, ETriggerEvent::Triggered, this, &ABatteryCollectorCharacter::CollectPickups);
※完成形
・SetupPlayerInputComponent関数で、「Looking」のBindActionの行をコピーして、第一引数のインプットアクションと、第四引数の関数名を変更する。
〇ビルド
・エラーが無ければOK。
〇UEエディタに移動
・「BP_ThirdPersonCharacter」をダブルクリックして、編集エディタを開く
・「詳細」タブで、カテゴリを「入力」と絞り込む。(英語環境ではInput)
・CollectActionに「IA_Collect」を設定
※コンパイル&保存は忘れずに!
〇回収の様子を、アウトプットログで確認する
・UEエディタ下にある「アウトプットロブ」をクリック
・右上の「レイアウトにドッキング」をクリック
〇テストプレイ
・ピックアップがスポーンされるので、
・電池の近くまで移動して、「C」キーを押して、電池が消えればOK。
・アウトプットログには、電池収集時のメッセージが表示される。
※不要になったら、「×」でアウトプットログを閉じる。
今回は回収関数を作ることで、ピックアップ物と相互作用(インタラクト)が出来るようになりました。
次回は、電池のパワー設定を行います。
以上、お疲れ様でした。
【参考までに】
〇BatteryPickupクラスの役割は、「ログ表示」と「電池破棄」である。
・「Collect」の流れをおさらいする。
・「Cキー」が押されたら、「CollectPickups」関数が呼ばれる。
・ピックアップしたのがバッテリーなら、「ABatteryPickup::WasCollected_Implementation」関数が呼ばれる。