ダッシュ中のスタミナの減少・増加方法!
かなりのお久しぶりです。
ちゃんと生きていました。
と言ってもこれだけ更新期間が無ければ、こんなこと言ったところでもうほぼほぼ誰も見ていないと思いますがw
でもこの記事が、今後迷えるUE4ユーザーさんの助けになれば幸いです。
そしてもし頭のいい人がいるなら、僕の教えたやり方を更により良くしてくれても構いません。
さて、長ったらしい前置きはお終い。本題に入りましょう!
今回やりたい事
・Shiftキーを押していて、移動中であればダッシュ。キャラのスピードが増加。
Shiftキーを放す、あるいはShiftキーを押したまま移動をやめたらダッシュ解除。
通常速度に戻る。
・ダッシュ中はスタミナ減少。スタミナが「0」になると、ダッシュ不可。通常速度に戻る。
・スタミナが一定値まで回復するまでは何度Shiftキーを押してもダッシュは不可。
スタミナが一定値まで回復すればダッシュ可能。
・スタミナが減る条件↓
・地面にいること
・ダッシュ中であること
・スタミナが「0」以上であること
それではやっていきましょう。
使うのはサードパーソンテンプレート。キャラクターBPを開きましょう。
イベントグラフはこんな感じです。
変数は以下の通り。
CurrentStamina・・・デフォルト値「100」
SprintSpeed・・・デフォルト値「1200」
MaxStamina・・・デフォルト値「100」
DashResumableValue・・・デフォルト値「30」
DecreaseStaminaRate・・・デフォルト値「0.5」
IncreaseStaminaRate・・・デフォルト値「0.1」
Sprint・・・ダッシュキーが押されたかどうかのBool値。デフォルト値「False」
MyUMG・・・UMGの参照変数
DecreaseStaminaTimer・・・スタミナを減少させるためのタイマー変数。Tickの代わり。
IncreaseStaminaTimer・・・スタミナを増加させるためのタイマー変数。Tickの代わり。
まず、ゲーム開始時スタミナゲージを表示するためのUMGを表示。
その後、スタミナ値をインターフェースでUMGに渡します。
キーが押されているかを取得
押しているときは、True
押していないときは、False
さて、冒頭で述べたように
Shiftキーを押していて、移動してればダッシュ
と言いました。
つまり、移動中「Shiftキーを長押し」していればダッシュ可能という事。
ですが生憎、このインプットアクションキーというのは、
キーが押された瞬間・キーが放された瞬間しか処理が流れないのです。
では、どうやってキーを押している間処理を走らせるのか??
以下のマクロを使用しましょう!
↓
これは自作マクロです。中身は以下の通り。
キーを押している間は、このマクロ内をひたすらループし、ひたすら処理を流します。
Sprintキーが放されたらループ解除です。
Delayを挟まないと、「おい無限ループしてんぞ!?」みたいな感じでUE4側からお怒りのエラーメッセージが来ますw
では、実際にダッシュが可能かどうかを判定する処理「SprintCheckGraph」の中身を見てみましょう。
SprintCheckGraphの中身は以下通り。
まず、ダッシュ可能かどうかの判定
CanSprintというノードは、純粋化(ピュア化)した自作関数です。
中身はこんな感じ。
ダッシュ可能(True)の場合、まずスタミナ値が一定値を超しているかの判定を行います。
これは冒頭で述べた
スタミナが一定値まで回復するまでは何度Shiftキーを押してもダッシュは不可。
という仕様を実現させるためです。
DashResumableImmediately??というノードも、純粋化した自作関数です。
中身↓
ダッシュ可能で、現在のスタミナが一定値を超していればダッシュ可能。
タイマー処理でダッシュ処理・スタミナ増減処理を行います。
「0.01」のレートでタイマーをループさせてます。Tickの代わりですね。
TimerノードのFunctionNameには以下のように名前を入れましょう。
この名前は、自分で作ったカスタムイベント名の事です。
この後出てきます。
SprintCheckGraphは以上です。
次は、「SprintSystem」の中身を見ていきましょう。
中身↓
まず、スタミナ減少処理から見ていきましょう。
スタミナ減少処理↓
DecreaseStaminaイベントがTimerノードから呼び出された時、スタミナの減少処理を「CalculateDecreaseStaminaAmount」関数で行います。
これも自作関数です。
CalculateDecreaseStaminaAmount関数の中身↓
現在のスタミナをDecreaseStaminaRateの値分減算していきます。
現在のスタミナが「0」かを判定
False・・・スタミナが「0」じゃない場合↓
現在のスタミナを、スタミナ上限値「MaxStamina」で割り、「1~0」の値にします。
これは、UMGでプログレスバーを使ってスタミナゲージの表示を行うので、割り算をし「1~0」の値に変えているわけです。
プログレスバーは「1~0」の値しか受け付けないので。
割り算した値を、インターフェースでUMGに渡します。
その後、SprintSpeedの値をMaxWalkSpeedにセット。
True・・・スタミナが「0」だった場合↓
スタミナ減少処理のタイマーノードを停止。
その後、スタミナ増加処理のタイマーノードを呼び出します。
スタミナ増加処理↓
IncreaseStaminaイベントがTimerノードから呼び出された時、スタミナの増加処理を「CalculateIncreaseStaminaAmount」関数で行います。
自作関数です。
CalculateIncreaseStaminaAmount関数の中身↓
現在のスタミナにIncreaseStaminaRateの値分加算していきます。
スタミナ値が上限値を超えないよう、Clampで範囲を設けています。
スタミナ値が一定値を超しているかを判定。
False・・・スタミナ値が一定値に達していない場合↓
↑スタミナ値(CurrentStamina)がスタミナ上限値と同じかどうかを判定。
上限値と同等じゃない場合は、スタミナ値をスタミナ上限値で割った値をインターフェースでUMGに渡す。
上限値と同等の場合、スタミナ増加処理のタイマーノードを停止。
True・・・スタミナ値が一定値を超している場合↓
スタミナ増加処理のタイマーノードを停止。スタミナ減少処理のタイマーノードを呼び出す。
キャラクターBPは以上になります。
あとは、スタミナ値を表示するためのUMGを作成しましょう!
「MyUMG」という名前で作成しました。
プログレスバーを左上に設置しただけです。
UMGのイベントグラフです。↓
これですべて完了です!
実際にやってみましょう!
しっかり速度が変化してるか分かりやすくする為に、周りに柱を何本か置きました。
分かりやすければいいのですがw
あとは実際にやって色々確かめてみてください!
それではまた!^^ノシ