FPS(フレームレート)の変更方法!
キャラクターBPとレベルBP
どっちでもいいので、
イベントグラフに
以下のような処理を組みます。
「1」キー・・・「30FPS」に変更
「2」キー・・・「60FPS」に変更
「3」キー・・・「120FPS」に変更
「4」キー・・・「FPSを無制限」に変更
コンソールコマンドを使って
FPSを変更しています。
使用するコマンドは、
「t.MaxFPS 〇〇」
です。
〇〇の部分に、
設定したいフレームレート値を入れます。
60FPSなら、「t.MaxFPS 60」です。
FPSとフレームレート値の間は、
必ずスペースを空けましょう。
じゃないと、動作しません。
×→「t.MaxFPS60」
〇→「t.MaxFPS 60」
動作確認をしましょう。
FPSをリアルタイムで見るには、
ビューポート左上の「▼」をクリック。
「FPSを表示」を選択しましょう。
ビューポート右上に、FPSが表示されます。
プレイして確認です。
各キーを押して、
しっかりとFPSが変更されていれば成功です。
それではまた!^^ノシ
PhysicsAnimationコンポーネントで、酔っぱらいを作ってみようか!
↓今回は、酔っぱらいのおっさんみたいな「ふにゃふにゃ人間」を作っていきます!
そのためには・・・
PhysicsAnimationコンポーネント
を使います!
PhysicsAnimationコンポーネントを使えば、
物理シュミレーションベースのアニメーションをさせることが出来ます!
言葉ではあまりピンと来ないと思うので、
実際にやってみましょう!
↓キャラクターBPに処理を組んでいきます!
・
・
・
~キャラクターBP~
PhysicsAnimationコンポーネントを追加
↓追加されると、以下の画像のようになります。
CapsuleComponentのCapsuleRadiusの値を「21」にします。
絶対に「21」でないとダメという事はありません。
キャラクターの両腕がCapsuleComponentからはみ出ていればいいです。
変数
BoneName・・・物理シュミレーションを適用したいボーン名を入れる変数。
とりあえずデフォルト値は「Spine_01」
OrientationStrength・・・デフォルト値「1000」
AngularVelocityStrength・・・デフォルト値「100」
Meshコンポーネントの「CollisionEnabled」を
「PhysicsOnly(NoQueryCollision)」にします。
物理シュミレーション時に、コリジョンを有効にするという感じです。
「CollisionEnabled(Query and Physics)」でも可能です。
イベントグラフ
プレイ開始時、MeshにPhysicsAnimationコンポーネントを適用
指定したボーン(BoneName)に、PhysicsAnimationコンポーネントのパラメーターを適用。
指定したボーンの物理シュミレーションを適用。
これで完了です!
これでプレイしてみると・・・
上の動画のように
非常にだらしない人間になったとおもいます!(笑)
壁にぶつかったり、ジャンプしたりすると、体が面白い感じでねじ曲がったり、振り回されたりするので、動かしているだけでも非常に面白いですね。
OrientationStrength
と
AngularVelocityStrength
の値を変えてみて、挙動の変化を楽しんでみてください!
それではまた!^^ノシ
PredictProjectilePathByTraceChannelを使って、グレネードもどきを投げてみよう!
かなりのお久です。
もう僕の存在なんて忘れてしまったのではないでしょうか??(笑)
そもそも、端(はな)から僕の存在を知っている人がいるかどうかも疑問です(笑)
さて、自虐的な前座はここまで!本題に入りましょう!
↓今回やりたいことはこれ!!
(画像はTheLastOfUsというゲームのものです)
軌道に沿って、物を投げる方法!!
です!
キャラクターBPと投擲物(投げる物)のBPに処理を組んでいきます!
~キャラクターBP~
↓Sceneコンポーネントを追加します。
↓キャラの腹あたりの位置に置きましょう。
このSceneコンポーネントは
物を投げ始めるときの位置です。
変数
VelocityVector・・・デフォルト値「X:1000」「Z:1000」で。
イベントグラフ
↓最終的な完成図です
物を投げるモードの切り替え
軌道計算
ゲーム製作上、Tickはなるべく使わない方がいいのですが(処理負荷的に)
今回はそのような考慮は除いています。
物を投げるモードがONの時、軌道計算を行います。
物を投げる時の方向・速度を計算
軌道計算
PredictProjectilePathByTraceChannelというノードは
指定した位置(StartPos)から指定した速度(LaunchVelocity)で投げた時の軌道を計算してくれます。
PredictProjectilePathByTraceChannelの
各項目についてサラッと解説
StartPos・・・スタート位置
LaunchVelocity・・・投擲速度
TracePath・・・トレースが何かにヒットした時
トレースを貫通させないか(True)
トレースを貫通させるか(False)
ProjectileRadius・・・トレースの球体半径
TraceChannel・・・コリジョンチャンネル
TraceComplex・・・知らん
Actors to Ignore・・・知ってるようで知らん。結局知らん
DrawDebugType・・・トレースの描画方式
DrawDebugTime・・・トレースの描画時間
SimFrequency・・・トレースの球体個数。例)「5」→球体が5個描画される
MaxSimTime・・・トレースの描画距離。値が大きい程トレースの描画距離が延びる。
OverrideGravityZ・・・重力。値が大きいほど、トレースは上に反って描画される。
ざっとこんなもんです。完全に己の勘です。どっか間違ってるかもw
まあよくわかんなかったら試してみてください(笑)
物を投げる
物を投げるモードONの時、投擲可能
Sceneコンポーネントの位置から物を投げる
物を投げる時の速度を設定
VelocityVectorの
「X」の値は、大きい程、遠くまで飛びます。
「Z」の値は、大きい程、高く飛びます。
ただ、「Z」の値があまりにも大きいと前に物を投げたいのに、
後ろに投げてしまう現象が起きますw
色々試して、ちょうどいい値を探ってみて下さい(適当)
~投擲物BP~
↓Granade・・・スフィアコンポーネントにしました。
スフィアのサイズは、軌道に沿ってるか確認したい為、小さめにしてます。
ProjectileMovementは特に何も設定しません。
これで完了です!
先に挙げた動画のようになると思います!
ちなみに・・・
PredictProjectilePathByTraceChannelの
SimFrequencyの値は、「1」以上じゃないと、軌道通りに物が飛んでくれません。
実際試してみると分かるのですが、投げたものが軌道からズレていくと思います。
なので、SimFrequencyに入れる値は「2」以上が良いでしょう。
それではまた!^^ノシ
飛ばした矢の突き刺し方!
飛ばした矢やダーツのような発射物を
ヒットした位置に突き刺す方法です。
きっとダーツゲームや弓矢ゲーム
あるいは、人殺しダーツゲームや人殺し弓矢ゲームできっと役に立つでしょう。(^^)
↓以下のようなことが出来ます!
※ファーストパーソンテンプレートを使用してます
~矢の作成~
↓「Arrow(矢)」という名のActorを作成しました。
CollisionComponent・・・当たり判定を取るためのコンポーネント
Arrow・・・飛ばすもの(矢とかダーツとか)
Projectile・・・物を飛ばすためのコンポーネント
↓CollisionComponentは、矢のちょうど真ん中あたりに来るようにしている。
↓CollisionComponentのコリジョン設定
↓Arrowのコリジョン設定
~矢を飛ばした時に、弧を描きながら飛ばす方法~
Projectileコンポーネントの詳細パネルにある「Projectile項目」にある
「RotationFollowVelocity」にチェックをつけます。
「RotationFollowVelocity」にチェックをつけた場合と、つけていない場合を見比べてみましょう。↓
RotationFollowVelocity「ON」
RotationFollowVelocity「OFF」
一目瞭然ですよね。
RotationFollowVelocityを「ON」にしている方が、いかにも矢という感じがしていいですよね。
~矢がヒットした位置に、矢を突き刺す~
↓「Arrow」のイベントグラフ
矢のヒットした位置に、「StaticArrow」という
「何かに突き刺さった用の矢」をスポーンしています。
それでは、「StaticArrow(何かに突き刺さった用の矢)」を作成しましょう。
「StaticArrow」
Scene・・・Arrowの位置を自由に変更できるようにする為に親として置いているだけ
Arrow・・・何かに突き刺さった用の矢。飛ばす用の矢「Arrow」と同じメッシュを使用
ちなみに、飛ばす矢である「Arrow」の位置と突き刺さった時用の矢「StaticArrow」の位置は、同じにしましょう。
例えば、「Arrow」の位置が「X:-50」なら
「StaticArrow」の位置も「X:-50」にする。
↓Arrowのコリジョン設定
あとは、作成した矢「Arrow」を飛ばすだけです。
~実際に矢を飛ばそう!~
ファーストパーソンテンプレートにデフォルトで備わってる以下のBPを開きましょう。↓
イベントグラフ
↓Arrowをスポーンさせます
これで完了です。
あとは、Projectileの発射速度をいじって、色々遊んでみてください^^
それではまた!^^ノシ
SpawnDecalAtLocationで、デカールがスポーンされなかった時の話。そしてその原因
つい最近、暇つぶしに自己満足人殺しゲーを作ってた時にあった話です。
まだSpawnDecalAtLocationを使ったことないような人は、多分つまづきそうなポイントなので書きますね。
人殺しゲーと言うぐらいですから、当然血はつきものです。
なので人を殺した時に、殺された人の場所に血のデカールをスポーンさせようとしました。
こんな感じで↓
デカールをスポーンさせたいとき、「SpawnDecalAtLocation」を使いますよね。
なので、このような処理で血のデカールをスポーンさせようとしました。↓
SpawnDecalAtLocationのSpawnSizeの「XYZ」はすべて「1」にしました。
デフォルトサイズで表示させたかったので。
これでやってみると・・・
はい。スポーンされません。↑
Before
After
一目瞭然ですよね。
原因は何かというと・・・
このDecalSizeの値です!↓
僕は、「拡大・縮小」の部分の数値を入れればいいと思い、「XYZ」すべてを「1」にしました。
ですが、本当に入れるべき値は・・・
DecalSizeの部分の値なのです。
Decalのデフォルトサイズは
「X:128」「Y:256」「Z:256」です。
なので、この値を入れてやれば・・・↓
はい!望んでた通り、デフォルトサイズでデカールが表示されます!↓
最初は、表示されないのがバグだと思ってましたが、そんなことはなかったですww
これからSpawnDecalAtLocationを使ってみようかなーと思ってる方はぜひご一読を!
それではまた!^^ノシ
左スティックの倒し具合で、歩行・走行を切り替える方法!
皆さんは、
左スティックが
どれだけ倒されたかによって、
移動状態(歩行・走行)を切り替えたいッッッ・・・!
と思ったことはないでしょうか??(俺はありますよ??)
今回はそんな悩みを抱えた人たちの役に立つかもしれない記事を書きました。
やりたいことをそれなりに分かりやすく図にしました。↓
左スティックを上から見た感じの図ですね。
左スティックを何も倒していない時、Idle(図だと赤の部分の事)
左スティックを少し倒した状態~全開の手前まで倒していれば、Walk(図だと黄色の部分の事)
左スティックを全開の手前~全開まで倒していれば、Run(図だと緑の部分の事)
これを実現するための方法を教えます。
※サードパーソンテンプレートを使用します。
ThirdPersonCharacterBPを開きましょう。
変数
MovementChangeValue・・・デフォルト値「0.9」 左スティックがこの値を超えた時に歩行状態(歩行・走行)を切り替える
ForwardAxis・・・Axis値
RightAxis・・・Axis値
F-Axis・・・画像の説明の通り
R-Axis・・・画像の説明の通り
イベントグラフ
左スティックがどれだけ倒されているかを
「CalsulateAnalogStickAxisValue」純粋関数で計算します。
自作関数ですね。
「CalsulateAnalogStickAxisValue」の中身↓
F-Axis・・・左スティックが前、あるいは後ろにどれだけ倒されているかの値
R-Axis・・・左スティックが左、あるいは右にどれだけ倒されているかの値
「GetForward/RightVector」マクロ
ただ単に見た目をコンパクトにする為だけにマクロにしてるだけですw
「GetForward/RightVector」の中身↓
「MaxInput??」という純粋関数で左スティックがどれだけ倒されているかを判定します。
自作関数です。
「MaxInput??」の中身↓
MovementChangeValueというのは、
左スティックがどれだけ倒されたかによって
移動状態(歩行、走行)を変える値の事です。
例えば、MovementChangeValueのデフォルト値を「0.5」にした場合。
左スティックを半分(0.5)以下の量まで倒していれば歩行
左スティックを半分(0.5)以上の量まで倒していれば走行
という事になります。
歩行時はMaxWalkSpeed・MinAnalogWalkSpeed「200」
走行時はMaxWalkSpeed・MinAnalogWalkSpeed「600」
さて、さりげなく出てきた
MinAnalogWalkSpeed
とは何なのか??
MinAnalogWalkSpeedとは、
左スティックが倒された時の最小歩行速度
の事です。
例えば、MinAnalogWalkSpeedの値を「100」に設定した場合
左スティックを倒し始めた時の最小歩行速度は「100」になります。
そこから更に左スティックを倒すと、速度はMaxWalkSpeedの値まで到達しようとします。
MinAnalogWalkSpeedの値の設定は、CharacterMovementの詳細パネルで出来ます。
さて、実際にやってみましょう!
まあ、映像じゃさっぱり分からないですよねww
でも実際にやってみればわかります。
左スティックを全開まで倒せば走行
それ以外は全部歩行になるはずです。
それではまた!^^ノシ
ダッシュ中のスタミナの減少・増加方法!
かなりのお久しぶりです。
ちゃんと生きていました。
と言ってもこれだけ更新期間が無ければ、こんなこと言ったところでもうほぼほぼ誰も見ていないと思いますが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
あとは実際にやって色々確かめてみてください!
それではまた!^^ノシ