ダッシュ中のスタミナの減少・増加方法!

かなりのお久しぶりです。

ちゃんと生きていました。

と言ってもこれだけ更新期間が無ければ、こんなこと言ったところでもうほぼほぼ誰も見ていないと思いますがw

でもこの記事が、今後迷えるUE4ユーザーさんの助けになれば幸いです。

そしてもし頭のいい人がいるなら、僕の教えたやり方を更により良くしてくれても構いません。

さて、長ったらしい前置きはお終い。本題に入りましょう!

 

今回やりたい事

・Shiftキーを押していて、移動中であればダッシュ。キャラのスピードが増加。
 Shiftキーを放す、あるいはShiftキーを押したまま移動をやめたらダッシュ解除。

 通常速度に戻る。

ダッシュ中はスタミナ減少。スタミナが「0」になると、ダッシュ不可。通常速度に戻る。

・スタミナが一定値まで回復するまでは何度Shiftキーを押してもダッシュは不可。

 スタミナが一定値まで回復すればダッシュ可能。

・スタミナが減る条件↓

 ・地面にいること

 ・ダッシュ中であること

 ・スタミナが「0」以上であること

 

 

それではやっていきましょう。

 

 

使うのはサードパーソンテンプレート。キャラクターBPを開きましょう。

f:id:Free_Gamer:20190210130802p:plain

イベントグラフはこんな感じです。

f:id:Free_Gamer:20190210150436p:plain
変数は以下の通り。

f:id:Free_Gamer:20190210131558p:plain

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に渡します。

f:id:Free_Gamer:20190210150711p:plain

 

キーが押されているかを取得

押しているときは、True
押していないときは、False

f:id:Free_Gamer:20190210133428p:plain

さて、冒頭で述べたように

 

Shiftキーを押していて、移動してればダッシュ

 

と言いました。

 

つまり、移動中「Shiftキーを長押し」していればダッシュ可能という事。

 

ですが生憎、このインプットアクションキーというのは、

 

キーが押された瞬間・キーが放された瞬間しか処理が流れないのです。

では、どうやってキーを押している間処理を走らせるのか??

 

以下のマクロを使用しましょう!

f:id:Free_Gamer:20190210133337p:plain

これは自作マクロです。中身は以下の通り。

キーを押している間は、このマクロ内をひたすらループし、ひたすら処理を流します。

Sprintキーが放されたらループ解除です。

Delayを挟まないと、「おい無限ループしてんぞ!?」みたいな感じでUE4側からお怒りのエラーメッセージが来ますw

f:id:Free_Gamer:20190210133943p:plain

では、実際にダッシュが可能かどうかを判定する処理「SprintCheckGraph」の中身を見てみましょう。

f:id:Free_Gamer:20190210134328p:plain

 

SprintCheckGraphの中身は以下通り。

f:id:Free_Gamer:20190210134732p:plain

 

まず、ダッシュ可能かどうかの判定

f:id:Free_Gamer:20190210134842p:plain

CanSprintというノードは、純粋化(ピュア化)した自作関数です。

中身はこんな感じ。

f:id:Free_Gamer:20190210135045p:plain

 

ダッシュ可能(True)の場合、まずスタミナ値が一定値を超しているかの判定を行います。

f:id:Free_Gamer:20190210135432p:plain

これは冒頭で述べた

 

スタミナが一定値まで回復するまでは何度Shiftキーを押してもダッシュは不可。

 

という仕様を実現させるためです。

 

DashResumableImmediately??というノードも、純粋化した自作関数です。

中身↓

f:id:Free_Gamer:20190210135602p:plain

ダッシュ可能で、現在のスタミナが一定値を超していればダッシュ可能。

 

タイマー処理でダッシュ処理・スタミナ増減処理を行います。

「0.01」のレートでタイマーをループさせてます。Tickの代わりですね。

f:id:Free_Gamer:20190210135856p:plain

TimerノードのFunctionNameには以下のように名前を入れましょう。

この名前は、自分で作ったカスタムイベント名の事です。

この後出てきます。

f:id:Free_Gamer:20190210140215p:plain


SprintCheckGraphは以上です。

 

次は、「SprintSystem」の中身を見ていきましょう。

f:id:Free_Gamer:20190210140443p:plain

中身↓

f:id:Free_Gamer:20190210140546p:plain

 

まず、スタミナ減少処理から見ていきましょう。

 

スタミナ減少処理↓

 

f:id:Free_Gamer:20190210140638p:plain

DecreaseStaminaイベントがTimerノードから呼び出された時、スタミナの減少処理を「CalculateDecreaseStaminaAmount」関数で行います。

これも自作関数です。

 

CalculateDecreaseStaminaAmount関数の中身↓

現在のスタミナをDecreaseStaminaRateの値分減算していきます。

f:id:Free_Gamer:20190210141033p:plain

 

現在のスタミナが「0」かを判定

f:id:Free_Gamer:20190210141250p:plain

 

False・・・スタミナが「0」じゃない場合↓

f:id:Free_Gamer:20190210141345p:plain

現在のスタミナを、スタミナ上限値「MaxStamina」で割り、「1~0」の値にします。

これは、UMGでプログレスバーを使ってスタミナゲージの表示を行うので、割り算をし「1~0」の値に変えているわけです。

プログレスバーは「1~0」の値しか受け付けないので。

割り算した値を、インターフェースでUMGに渡します。

その後、SprintSpeedの値をMaxWalkSpeedにセット。

 

True・・・スタミナが「0」だった場合↓

スタミナ減少処理のタイマーノードを停止。

その後、スタミナ増加処理のタイマーノードを呼び出します。

f:id:Free_Gamer:20190210142329p:plain

 

スタミナ増加処理↓

f:id:Free_Gamer:20190210143148p:plain

IncreaseStaminaイベントがTimerノードから呼び出された時、スタミナの増加処理を「CalculateIncreaseStaminaAmount」関数で行います。

自作関数です。

 

CalculateIncreaseStaminaAmount関数の中身↓

現在のスタミナにIncreaseStaminaRateの値分加算していきます。

スタミナ値が上限値を超えないよう、Clampで範囲を設けています。

f:id:Free_Gamer:20190210143314p:plain

 

スタミナ値が一定値を超しているかを判定。

f:id:Free_Gamer:20190210143603p:plain

 

False・・・スタミナ値が一定値に達していない場合↓

f:id:Free_Gamer:20190210143959p:plain

↑スタミナ値(CurrentStamina)がスタミナ上限値と同じかどうかを判定。

 

上限値と同等じゃない場合は、スタミナ値をスタミナ上限値で割った値をインターフェースでUMGに渡す。

上限値と同等の場合、スタミナ増加処理のタイマーノードを停止。

f:id:Free_Gamer:20190210144448p:plain

 

True・・・スタミナ値が一定値を超している場合↓

f:id:Free_Gamer:20190210144644p:plain

スタミナ増加処理のタイマーノードを停止。スタミナ減少処理のタイマーノードを呼び出す。

 

キャラクターBPは以上になります。

 

 

あとは、スタミナ値を表示するためのUMGを作成しましょう!

「MyUMG」という名前で作成しました。

f:id:Free_Gamer:20190210150915p:plain

 

プログレスバーを左上に設置しただけです。

f:id:Free_Gamer:20190210151023p:plain

 

UMGのイベントグラフです。↓

f:id:Free_Gamer:20190210151254p:plain

 

これですべて完了です!

 

実際にやってみましょう!

www.youtube.com

 

しっかり速度が変化してるか分かりやすくする為に、周りに柱を何本か置きました。

分かりやすければいいのですがw

 

あとは実際にやって色々確かめてみてください!

 

それではまた!^^ノシ