Friday, November 30, 2018

Amazon Lumberyard学習メモ:コリジョンが付いたオブジェクトを作成する

前々回のキャラクター改修でアクターにフィジックスを適用したので、今回はそれを利用し、キャラクターがインタラクト出来るオブジェクトを作ってみます。

参考資料:Amazon Lumberyardユーザーガイド

まずオブジェクトの準備です。必要なのは表示オブジェクトとコリジョンオブジェクトです。

上図のオブジェクトは階段として使います。

この二つのオブジェクトを一つのMayaシーンに入れ、コリジョンオブジェクトの方には「_phys」というサフィックスを付けます。(下図のOutlinerの表示を参照して下さい。)

この様に「_phys」というサフィックスが付いているオブジェクトはLumberyardに持ち込んだ時に自動でコリジョンとして扱われる様になります。

このMayaシーンをExport - AllでFBXとしてエクスポートします。
エクスポートしたFBXファイルは、今まで同様にStarterGameの下に作ったフォルダに移動させました。

続いてLumberyardでの作業です。
新規にEntityを作成し、Add Componentで以下のコンポーネントを追加します。
・Mesh
・Mesh Collider
・Static Physics
Meshコンポーネントには先ほどのFBXをロードします。

とりあえずこれでコリジョン付きオブジェクトとして作動する様になります。

今回はもう一つオブジェクトを用意しました。こちらはキャラクターを衝突させて動かすテストに使います。


こちらの為のEntityには以下のコンポーネントを追加します。
・Mesh
・Mesh Collider
・Rigid Body Physics
先ほどのオブジェクトに使ったStatic Physicsコンポーネントと違い、Rigid Body Physicsコンポーネントを使うと動かせるオブジェクトが作れます。
ただ、余りにオブジェクトが重いとキャラクターが衝突しても動かないので、「Density (Kg / Cubic meter)」の値を小さくしておきます。今回は5.0に設定しました。


次にマテリアルとテクスチャーの設定です。
基本的には以前の記事と同じですが、今回のオブジェクトにはコリジョンオブジェクト用のマテリアルも付いていますので、最初に表示オブジェクト用のマテリアルの方をクリックしてから作業を行います。


通常通り、各テクスチャーをスロットにロードし、Diffuse Color(Tint)・Specular Color・Smoothnessの各値を255に設定します。


出来上がったオブジェクトをレベルに配置してみました。


Play Gameでテストしてみます。

階段を降りてキューブに衝突し倒す事が出来ました。

コリジョンを表示して確認したい場合は以下の様にします。
まずTools - Consoleでコンソールを表示します。


次にコンソールの左下にある(x)アイコンをクリックします。


Console Variablesが表示されるので、「p_draw_helpers」の値を1にします。


コリジョンが表示されます。

「p_draw_helpers」の値を0にすると非表示に戻ります。

オブジェクトデータ上でコリジョンを確認するには以下の様にします。
まずTools - Asset Browserでアセットブラウザーを表示します。


オブジェクトを選び、マウス右ボタンで出るメニューからEdit Settings...を実行します。


Modifiersの中のCryPhysicsProxyのPhysics meshesの右端のアイコンをクリックします。


「_phys」というサフィックスが付いているオブジェクトにチェックが入っているのが確認出来ます。


確認が終わったらCancelで戻ってください。

Wednesday, November 21, 2018

Amazon Lumberyard学習メモ:ゲーム開始時に自動で処理を実行する

キャラクター改良の続きです。
今回は「Script Canvasで変数を初期化する」です。

参考資料:LumberyardユーザーガイドのScript Canvas チュートリアル

キャラクターの移動処理を作成した回の記事で少し触れましたが、現在はScript Canvasで変数に適切な初期値がセットされていない為、最初にキャラクターを回転させないと移動が出来ません。(後から気づいたのですが)初期値自体はScript CanvasのNode Inspectorでセットしておく事が出来ます。しかし今回の場合、キャラクターが最初にどの方向を向いているかによって変数に入るべき値が異なります。
そこで、Play Gameを実行した時点で変数に適切な初期値が入る様に改良します。

ゲーム開始時に処理を実行するにはOn Graph Startというノードを使います。ただし、上記資料によるとこれはエンティティが初期化された直後に実行される様です。現在はキャラクターのエンティティとスクリプトキャンバスが入っているエンティティとが別なので、スクリプトキャンバスのエンティティが初期化された時点でキャラクターのエンティティが初期化されていなければ目的の処理が出来ないと思われます。

それを解決する為にまず、現行のスクリプトをキャラクターのエンティティに移し換える作業を行います。キャラクターのエンティティにスクリプトが入っていれば、必ずキャラクターのエンティティが初期化された後にスクリプトが実行される事になります。

キャラクターのエンティティにScript CanvasコンポーネントとInputコンポーネントを追加し、現在使っているスクリプトとインプットバインディングのファイルをロードします。


スクリプトを開きます。このスクリプトは元々キャラクターのエンティティとは別のエンティティに属していた為、この様にキャラクターのエンティティを参照する様になっています。


現在はキャラクターのエンティティに属しているので、参照をselfに変更します。(参照に使っていたノードを削除すると自動でselfになります。)

これで、現行のスクリプトがキャラクターのエンティティに移し替えられました。

次に、今回のメインである「ゲーム開始時に変数に値をセットする」という処理を作ります。
スクリプトの中で変数をセットする部分を複製し、スタート部分(元々inputが接続されていた部分)をOn Graph Startにします。

これでゲーム開始時に変数に値がセットされる様になりました。

最初にスクリプトが入っていたエンティティはもう必要無いので削除します。

以上で作業終了です。
今回は地味ですが重要な件でした。

Saturday, November 17, 2018

Lumberyard 1.16.0.0インストール

Lumberyardの新バージョンをインストールしてみました。

私の環境では最初インストールがフェイルしました。

Microsoft Visual C++ 2017 Redistributable (x64)をアンインストールしてから再度実行し、インストール出来ました。




以前作成したデータも持ち込めたので、こちらのバージョンに移行する事にします。

Friday, November 16, 2018

Amazon Lumberyard学習メモ:Actorにフィジックスを適用する

キャラクター改良の続きです。
今回は「高低差がある地形の上を移動出来る様にする」です。

参考資料:Amazon Lumberyard character made with mixamo, blender, and script canvas.
Amazon Game TechのYoutubeチャンネル

以前作成したキャラクターの移動は平面上だけに限られていました。地面の上を歩いていたのも実は見掛けだけで、実際は地平面の位置にキャラクターの高さを合わせていただけに過ぎません。

今回はキャラクター(アクター)にフィジックスを適用し、重力を作用させて、地面のコリジョンの上に接触しながら移動する様にします。

まずLumberyardの機能を使って地形を作成しましょう。
これはいつものキャラクターのレベルです。


Tools - Terrain Editorを実行します。


Terrain Editorが開きました。

Terrain Editorは地形を作成する為のツールです。今回は自動生成で地形を作る事にします。

最初に地形の最も高い部分の高さを決めます。
Terrain EditorのModify - Set Terrain Max Heightを実行します。


数値入力ウィンドウが出ますので、高さの数値を入力します。今回は100としました。

OKをクリックして戻ります。

次にTerrain EditorのTools - Generate Terrain...を実行します。


地形生成に使う各パラメータが表示されます。今回はデフォルト設定を使う事にし、そのままOKをクリックします。


地形が生成され、グレイスケール画像が表示されました。Terrain Editorを閉じて下さい。


地面に高さがついているのが確認出来ます。
地面が持ち上がったのでキャラクターとカメラはその下になってしまっています。


キャラクターとカメラを地面の上に持ってきました。


ここで試しにGame - Play Gameを実行してみます。キャラクターが待機モーションになりましたが、まだフィジックスを入れていないので重力が作用していません。


フィジックスをキャラクターに追加してみましょう。
Escキーを押してゲームから抜けます。


キャラクターを選択してからEntity Inspectorを見て下さい。キャラクターは現在この様なコンポーネント構成になっています。Add Componentをクリックして、コンポーネントのリストを表示して下さい。


Character Physicsを選択します。


Character Physicsが追加されました。


次にスクリプトの一部を書き換えます。
キャラクター移動の部分は現在この様になっています。


この中のMove EntityをAdd Impulseに置き換えます。(Impulseとはこういう事だそうです。)そして、調整の為に入力に掛け算していた数値も変更します。今回は変更前の500倍にしました。


書き換えが終わったらスクリプトをセーブし、Play Gameでテストです。
キャラクターが地形の上を歩く様になりました。


Tuesday, November 13, 2018

Amazon Lumberyard学習メモ:モーションブレンドとミラー

キャラクター改良の続きです。
今回は前後左右の移動に専用のモーションを割り当てる作業です。斜め移動の際は各モーションがブレンドされます。
あわせて、右方向のモーションをミラーして左方向のモーションとして使う手順も説明します。

参考資料:Amazon Game TechのYoutubeチャンネル

作業に先立ち、Mayaで後方移動と右移動のモーションを作成して、FBXファイルとして以前作った専用フォルダに配置しました。


ここからLumberyardでの作業です。
まずモーションミラーのセットアップを行います。ミラー設定はモーションにではなくActorに対しての作業になります。
Animation EditorのFile - Open Actorで使っているActorを開きます。


Actorが開きました。


View - Actor Managerを実行します。


Actor Managerが開きます。Mirror SetupのClick to setupをクリックします。


"Left:"と"Right:"に、キャラクターの各ジョイントに付けた左右のプレフィックスを入力します。(今回は"L_"と"R_"を使っています。)


入力が終わったら、右にあるPerform name based mappingアイコンをクリックします。


処理が実行された事を示すウィンドウが表示されますので、OKをクリックします。
Mirror Setupビューの下カラムにマッピング結果が表示されています。


セットアップが終わったらセーブアイコンからセーブします。

Mirror Setupは以上で終了です。ビューを閉じます。

続いて新規モーションの追加です。これは以前行ったのと同じ手順です。
追加が終わったらモーションセットをセーブします。


次はモーションブレンドのセットアップです。
以前作ったAnim Graphを開きます。


Anim Graphのパラメータに、モーションブレンドのウェイト値として使うfloatパラメータを追加します。範囲は0.0〜1.0です。


名前はDirectionとしました。


Anim Graphで、マウス右クリックで出るメニューからBlend Treeを選びます。


Blend Treeノードが追加されました。


以前State Machineに行ったのと同じ手順でトランジションを作成します。条件式には以前作ったGoパラメータを使い、値が3の時にBlend Treeに入り4の時に抜ける様に設定しました。


Blend Treeノードをダブルクリックして開きます。中はこの様になっています。


Blend Nノードを追加します。


Blend Nノードが追加されました。


Motionノードを追加します。


Motionノードが追加されました。


Motionノードを選択した状態で、アトリビュートからモーションをロードします。


選択しているMotionノードに前進モーションがロードされました。


同じ手順で、4個のMotionノードに前進モーション・後退モーション・右移動モーション2個を割り当てました。


右移動モーションの内の1個を選択し、アトリビュートのMirror Motionにチェックを入れます。これでモーションがミラーされ、左移動モーションとして使える様になります。


Parametersノードを追加します。


Parametersノードが追加されました。ノードには、現在Anim Graphが持っているパラメータが表示されています。


Anim Graphにある全ノードを下図の様に接続します。

先ほどAnim Graphに追加したDirectionパラメータをモーションブレンドのウェイトとして使っています。これで、Directionパラメータの数値を0.0から1.0の間で変化させる事によって各モーションがブレンドされながら変化する様になりました。
各モーションノードの順序は前回作成したスクリプトに従っています。後方が0.0で、そこから値が上がるにつれて左→前→右となり、1.0で再び後方に戻ります。

モーションブレンドのセットアップは基本的にこれでOKです。
Anim Graphをセーブします。


ここからは細かい調整です。
モーション間のガタつきを抑える為、Blend NノードのアトリビュートでSync ModeをFull Clip Basedにします。


Motionノードのアトリビュートで再生スピードの調整を行います。これは実際に表示してみてからの作業になります。


Blend Treeへのトランジションの時間を調整します。これが長いと移動し始める時に足が滑ってしまうので、デフォルトより短めにしました。


作業が終わったらAnim Graphをセーブします。


前回作ったスクリプトを使ってキャラクターのスクリプトを改造します。前回作った「アナログスティックの角度を0.0〜1.0の数値に変換するスクリプト」の結果部分を、先ほどAnim Graphに追加したDirectionパラメータ(モーションブレンドのウェイトとして使っているパラメータ)に接続しています。これで、アナログスティックの角度に応じてモーションブレンドが変化する様になりました。
前に作った前進モーションを表示する部分は、必要無くなったので削除します。


結果はこんな感じです。