Wednesday, December 19, 2018

Amazon Lumberyard学習メモ:Transformが変更される毎に処理を行う

最近フィジックス周りを調べている流れで、汎用の移動オブジェクトを作ってみました。結果的には余り実用的ではない物が出来上がってしまったのですが、色々面白かったので記事にします。



このオブジェクトは二つのEntityで構成されています。一つは足元の球、もう一つはその上にある本体です。下図の様な構成になっています。


球部分は地形や他のオブジェクトの上を移動します。本体部分はその球に追従します。
こちらがスクリプトです。


On Transform ChangedノードはTransformが変更される毎に、つまり球(self)が移動する毎に実行されます。次のGet World Translationノードで球の座標を取得し、次のAddノードでZ座標に任意の値を足して、最後のSet World Translationノードで本体部分の座標をセットします。

ただしこのままゲームを実行すると本体部分が落下しておかしな事になるので、Entity Inspectorで本体部分の質量を0.0に設定しておきます。

これで球が移動すると本体もそれに合わせて移動する様になります。

ところで、最初のムービーでは特に問題はなさそうに見えていますが、実際は厄介な現象が起きます。
ムービー内でRigidが適用された直方体を押しのけて移動していますが、対象物がどれだけ大きい質量を持っていても関係なく押す事が出来てしまいます。本体部分は座標を指定する事で移動させているので反動を受けないんですね。
更に、Staticが適用された物体が相手の場合は全く反動を受けずめり込んでしまいます。


…という事で使い方にかなり制限がありますが、操作するのはなかなか楽しいです。
次回は移動とジャンプ部分の処理について説明します。

No comments: