・前回は、キャラクターのパワー値を減らし、その様子を詳細タブで確認しました。
・今回は、プレイヤーの色を変えることで、パワー値の増減を簡単に確認できるようにしていきます。また、パワー値が変わることでキャラクターの「移動速度」も変わるようにします。
〇パワー値に応じて変わるキャラクターの移動速度のためのプロパティを作成
BatteryCollectorCharacter.h
・SpeedFactor、BaseSpeed変数宣言。
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Power", meta = (BlueprintProtected = "ture"))
float SpeedFactor; //キャラクターの移動速度のための乗数
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Power", meta = (BlueprintProtected = "ture"))
float BaseSpeed; //キャラクターのベースとなる移動速度
※完成形
・InitialPowerの箇所を複製して作成すると楽!。
・InitialPower 、SpeedFactor 、BaseSpeed の各値はGameModeからは変更されない。

〇コンストラクタでプロパティの初期値をセット
BatteryCollectorCharacter.cpp
//パワーレベルに依存する速度セット(テストして見つけた値なので、各自で適宜変更)
SpeedFactor = 0.75f;
BaseSpeed = 10.0f;
※完成形

〇CharacterPowerに基づいて、キャラクターの移動速度を操作する
BatteryCollectorCharacter.cpp
・UpdatePower関数内で、移動速度の更新を行う。
//パワーに基づいて移動速度を変更
GetCharacterMovement()->MaxWalkSpeed = BaseSpeed + SpeedFactor * CharacterPower;
※完成形
・移動速度の変更をこの機能に含めることによって、パワーが増減したら必ず移動速度も変更するようにする。
・GetCharacterMovement()を使って、CharacterMovementComponentにアクセスする。
BatteryCollectorCharacterも、Characterクラスを継承しているので、CharacterMovementComponentがある。
・MaxWalkSpeedには、パワー値が0の時の移動速度であるBaseSpeedがまず必要。
それに、SpeedFactorとCharacterPowerを掛けたものを加える。


〇ブループリントでマテリアルを変更する。
BatteryCollectorCharacter.h
・PowerChangeEffect関数を追加する。
UFUNCTION(BlueprintImplementableEvent, Category = "Power")
void PowerChangeEffect(); //ビジュアルエフェクトを呼び出す
※完成形
・継承先のBPで実装作業をするので、protectedセクションに書くことに注意。privateではエラーになる。
・BlueprintImplementableEvent:Blueprintからの呼び出しが可能でC++側での実装は持たない。
C++側からは呼び出しが可能なため、意図的にBlueprintのみにロジックを書く場合に使う。
・関数の中身は、ブループリントを作る人に任せることが出来る。
・マテリアルの変更や、パーティクルエフェクトの呼び出しなどは、C++のコードを書く人はこの時点では気にする必要はない。

〇UpdatePower関数で、PowerChangeEffect関数を呼び出す
BatteryCollectorCharacter.cpp
PowerChangeEffect(); //関数呼び出し
※完成形
・UpdatePower関数が呼び出されるたびに、ブループリントも呼び出される必要がある。
これはBlueprintImplementableEventを使うことで可能となる。

〇ビルド
エラーが無ければ、UEエディタへ移動
〇パワーレベルに基づく、新たなビジュアルエフェクトを作る
・BP_ThirdPersonCharacterを開く。
※ここからは、少しC++から離れます!(非プログラマーに任せたい)

・Meshを選択>「詳細」タブのマテリアル>「エレメント0」のマテリアルアイコンをダブルクリックし、マテリアルエディタを開く。

・マテリアルインスタンスが開かれるので、パラメータを変更してみる。
※チェックの入っていないパラメータは、チェックを入れることでパラメータを変更出来るようになる。

・Tintパラメータのカラーをダブルクリックすると、カラーピッカーが表示されるので、カラーのパラメータを変更してみる。>プレビューで、そのカラーが意図通り反映させていること分かる。>色が変更されることを確認したら、「キャンセル」ボタンを押す。

・「BP_ThirdPersonCharacter」のエディタに戻って、>Construction Scriptに、「Mesh」を配置。

・Meshから線を伸ばして、「Create Dynamic Material Instance」ノードを配置。

・Meshから線を伸ばして、「Get Materials」ノードを選択。
※Get Materialではないので注意!

・「Get Materials」ノードの配列ピンから線を出して、「get」と検索>「(コピー)を取得」を選択。

・「GET」ノードでは「0」を指定し、Source Materialピンにつなぐ。
※実行ピンもつないでおく(白線)

※Mesh(スケルタルメッシュ)のマテリアルを見ると2つあるが、「エレメント0」を使うことにした。

・「Create Dynamic Material Instance」ノードの「Return Value」を右クリック>「変数へ昇格」を選択。

・変数名:「PowerMaterial」に変更。

※完成形
・ゲームプレイ中は、この「PowerMaterial」変数にアクセスすることになる。
・これで、マテリアルを作成するために必要なものは設定できた。

〇PowerChangeEffectイベント(関数)をBPで実装
・イベントグラフを右クリックし、「powerchange」と検索>「イベントPower Change Effect」を選択。

・「イベントPower Change Effect」ノードが配置された。

※BlueprintImplementableEvent指定しているので「PowerChangeEffect関数」を配置出来た。

・「PowerMaterial」変数のゲッターノードを配置。

・「PowerMaterial」ノードから線を伸ばして、「Set Vector Parameter Value」ノードを配置>「Parameter Name」を設定したいので、パラメータ名を再度確認する。

・「MI_Quinn_01」マテリアルを開いて、カラーパラメータ名を確認>「Tint」だ!

・「Set Vector Parameter Value」ノードに戻り、「Parameter Name」に「Tint」とタイプする。
※実行ピンもつないでおく(白線)

〇「イベントPower Change Effect」が呼び出されるたびに、新たなVectorのParameter値をセットする。
・Set Vector Parameter Valueノードの「Value」パラメータを設定する。

・現在のパワー値と、開始時のパワー値を比較し、その高低を「Value」パラメータに入れることにする。
・BlueprintPure指定した以下の2つの関数を配置(ここがCharacterブループリントなので出来る)

・イベントグラフ内を右クリックして、「GetCurrentPower」と「GetInitialPower」を検索し、該当ノードを配置。

・CurrentPower(現在のパワー)をInitialPower(開始時のパワー)で割る。>これで、現在のパワーが開始時のパワーよりも多いか少ないか分かる。
※Returnピンから線を出して「/」を検索>「除算する」を選択。

・この計算結果を「0.0~1.0」の間に限定したので、Clamp(Float)ノードとつなぐ。
※仮に計算結果が開始時よりも格段に大きい値になったら、色がものすごいことになってしまうため。

〇現在のパワー値と開始時のパワー値の比較に基づいて、2つの色を補完する
・ClampのReturn Valueから線を伸ばして、「Lerp」と検索して、「Lerp(LinearColor)」を配置

・「Lerp」ノードの「Return Value」ピンを、「Set Vector Parameter Value」ノードの「Value」ピンにつなぐ。

〇Lerp(LinearColor)ノードで色設定
・AとBの□をクリック後、カラーピッカーで色を設定。
・Aはパワー値が低いときなので「水色」、Bはパワー値が高いときなので「オレンジ色」などにする。

〇完成したので、コンパイル&保存&テストプレイ
・テストプレイ直後はオレンジ色なので、かなりパワー値は高い。

・しばらく待機していると、パワー値は下がり、色はグレーっぽくなる。

・動きも遅くなってくる。

・Cキーで、電池を拾うと、

・オレンジ色に戻る。

・速度とパワー値の両方が機能していることを確認できればOK。
※現在の減衰値では色の変化に時間が掛かってしまうので、「BatteryCollectorGameMode.cpp」のコンストラクタ内で、「DecayRate」変数の初期値を変更し、再ビルドすると良い。

・今回は、キャラクターの移動速度とボディ色を変化させるようにしました。
・次回は、電池回収時に、キャラクターと電池の間に補給エフェクトを発生させていきます。
・以上、お疲れ様でした。