Wednesday, December 19, 2018

Amazon Lumberyard学習メモ:Tick毎に処理を行う

前回の続きです。今回は移動とジャンプについての説明です。

こちらが移動とジャンプのスクリプトです。


移動については以前キャラクターで作ったのと同じ処理です。ゲームパッドのアナログスティックの入力値に適当な値を掛け、Add Impulseノードを使って移動させます。
ただ、今回の様にジャンプが入るとそれだけでは不十分です。接地している時と空中にいる時とでは抵抗が異なるので、移動中にジャンプするといきなり移動速度が上がります。
それを防ぐ為に、上記スクリプトではジャンプの入力があった時点で移動に使うImpulseの処理を停止する様にしています。

しかし、ジャンプだけでなく段差からの落下の時も同じ問題が起きます。それを防ぐ為の処理を作るには、まずオブジェクトが空中にいるかどうかの判定を行う必要があります。

コリジョン間の接触検知といえばシューターの実験の時に使ったOn Collisionノードが思い浮かびますが、残念ながら分離は検知出来ない様です。他に接触判定に使えそうな物が分からなかったのでアプローチを変え、「垂直方向の加速度が重力加速度と一致したら落下中=空中にいる」という判定方法を取る事にしました。

Script CanvasのNode Palette内を探したところGet Accelerationというそのままの名前のノードを見つけたのですが、実験したところ何故か値0.0を返します。このノードだけではなくPhysics Componentカテゴリの他のGet系ノード(Get Mass等)も0.0を返す様です。使い方が間違ってるのか?
どうやったら正しい値が取れるのかLumberyardのフォーラムで質問しましたが返事が貰えなかったので、仕方なく加速度を検出するスクリプトを作りました。


やっている事は簡単で、
1)Tick毎にZ座標を取得する
2)二つのZ座標の差をTickのDeltaで割って速度を求める
3)二つの速度差をTickのDeltaで割って加速度を求める
という処理です。
実際は1Tick毎に処理すると数値の揺らぎがあり使い物になる値が得られなかったので、数Tick毎の累積で処理を行う様にしています。ですが累積時間があまりに長いと処理を行っている間にオブジェクトのXY方向の加速が大きくなってしまうので、なるべく短くしなければなりません。今回は2Tickにしました。(これでもよく見ると落下直後にXY方向に微妙に加速しているのが分かってしまいますが…)

垂直方向の加速度との比較に使う値ですが、空気抵抗を考慮して、重力加速度よりもやや小さい8.0としました。また、重要な事ですが、Lumberyard Editor1.16.0.0のエディタのデフォルトの重力加速度は何故か-13に設定されていますので、最初に(というかエディタを起動する度に)値を-9.8に設定し直さなければなりません。設定は以下の様に行います。
1)Tools - Consoleでコンソールを開く
2)コンソール左下隅の(x)アイコンをクリックしてConsole Variablesを開く
3)p_gravity_zの値を-9.8にする


最後に、オブジェクトの移動が終了した時にブレーキがかかる処理を作ります。
下図のスクリプトでは、アナログスティックを傾けた時にDampingを小さく、まっすぐに戻した時にDampingを大きくしています。


オブジェクトのデフォルトのDampingも停止時の値にしておきます。

No comments: