はじめに

本作品はL/Rのスティックを高速に回転させるゲームなのですが、フレームレートによって回転速度の取得処理に不具合があることが分かりました。この記事は今後同様の不具合を生まない為にも、何が原因で発生してしまった不具合かを解説していきたいと思います。

不具合の内容

スティックの回転速度取得処理において、CPUの処理速度が速い環境では回転速度が遅いと判定され、CPUの処理速度が遅い環境では回転速度が速いと判定されるという不具合が発生していました。

開発したマシンがCore i5 9400というミドルクラスのCPUでした。このCPUで処理を前提にプログラムを作成していた為、Core i9で動作させた場合にはスティックの回転パワーが全く溜まらない(回転が遅すぎると判定される)状態となり、逆にSteam Deck(CPU的には非力な分類)で動作させた場合は、スティックをゆっくり回転させてもパワーが簡単に溜まってしまうようになっていました。

入力処理はEnhancedInputを使用

UE5から入力系の処理はEnhancedInputを使用することが推奨されている為、本作品もEnhancedInputを使用してスティックの回転速度を取得していました。

EnhancedInputのそれぞれのピンの意味と回転速度の取得

EnhancedInputではスティックを動かし始めたタイミングで”Started”が、動かしている最中は”Triggered”が、動かすのを止めると”Completed”が呼び出されるようになっています。

これを前提として、スティックの回転速度の取得処理は、”Triggered”ピンのイベントが呼ばれる毎に現在のスティックの座標と、1つ前のスティックの座標の差分から求めていました。

“Triggered”ピンはフレーム毎に呼び出されている・・・のか?

本作品を制作するのまで気付かなかったのですが、この”Triggered”ピンはスティックを動かしている間ずっとフレーム毎に呼び出されていました。

簡単に言えばスティックを動かしている時のみ呼び出されるTickノードのようなイメージです。

Tickノードには”Delta Seconds”ピンが存在しているので、ロジックを組む時にフレームを意識し忘れることは無いのですが、EnhancedInputの”Triggered”ピンには”Delta Seconds”ピンが無い為、フレームレートを意識するという考えが抜けていました。

つまりCPUの処理速度が速いマシンの場合、”Triggered”ピンが頻繁に呼び出されるので、回転させているスティックの新旧座標の差が小さくなってしまい、(開発機のPCを基準とした回転速度取得処理において)スティックの回転が遅いと判断されていました。

逆にSteamDeckで動かした場合は”Triggered”ピンの呼び出し回数が減るので、その間に沢山スティックが動いたという判定になり、ゆっくり回しただけでも高速回転していると判断されてしまっていました。

修正方法

Tickノードの”Delta Seconds”ピンと同じ機能を持つ、Get World Delta Secondsノードからフレーム間の時間を取得し、スティックが移動した差分をこの値で割ってあげることで修正完了となりました。

言葉で説明すると「速いPCではスティックの移動距離は少ないが、その移動に要した時間も短い」「遅いPCではスティックの移動距離は多いが、その移動に要した時間も長い」という事になるので、移動距離を移動時間で割ってあげることで解決させています。(ここだけ聞くと、算数の授業みたいですね)

絵にするとこんな感じです。実際は速いPCの方がスティックを高速回転させていても、フレームレートを考慮しないと、遅いPCの方が早く回転しているように見えるって感じですね。

言われてみれば当たり前の事だが・・・

フレームレートを考慮するなんて当たり前のことですが、Tickノード以外では関係ないという固定観念に囚われていました。

更に、Delta Secondsの値って何らかの値(例えば移動速度など)に”掛けて”使う事が多いので、”割る”という状況が存在する事に気付かず、修正時にちょっと悩んでしまいました。

プレイしてもらう事の大切さ

UE5ぷちコンは作品を映像(動画)で提出するので、極論を言えば「開発したPCで正常に動けば良い」と言えるのですが、それでは不具合に気付くことなく学習になりませんでした。(UE5ぷちコンのコンセプトは「Unreal Engine 5の学習を目的としたコンテスト」なので、可能な限り学びがあるようにしたいです)

今回は作品の映像提出と同時に実行モジュールを公開したことでフィードバックを得ることができ、それで不具合に気付くことができました。

プレイしてもうらことは大事ですね!

No responses yet

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です