Saturday, October 6, 2018

Amazon Lumberyardで自作のキャラクターモデルを動かしてみる(6) -ゲームパッドでモーションを再生する-

今回はゲームパッドを使ってモーションを再生してみます。

今回の記事を書くにあたっては、こちらのサイトの記事を参考にさせて頂きました。
PaperSloth’s diary
Lumberyard ScriptCanvasで簡単なゲームロジック作成

前回までと同様、使用しているLumberyardのバージョンは1.15.0.0です。

これから二つの新規ファイルを作成しセーブします。
一つはキャラクターを動かすスクリプトファイル、もう一つはゲームパッドからの入力を取るinput bindingです。

まずはスクリプトファイルです。
Tools - Script Canvas (PREVIEW)を実行し、Script Canvasを開きます。


Script Canvasが開きました。


Script CanvasでFile - New scriptを実行し、新規スクリプトを作成します。


新規スクリプトが作成されました。


Script CanvasでFile - Saveを実行し、適当な場所に任意の名前でスクリプトファイルをセーブします。

今回はC:/Amazon/Lumberyard/1.15.0.0/dev/StarterGame/Items_LowPolyMan/miscというフォルダを作り、そこにセーブしました。

次はinput bindingです。
Tools - Asset Editorを実行し、Asset Editorを開きます。


Asset Editorが開きました。


Asset EditorでFile - New - Input bindingsを実行してファイルブラウザを出し、適当な場所に任意の名前でInput bindingsのファイルをセーブします。

今回は先ほどのスクリプトファイルと同じC:/Amazon/Lumberyard/1.15.0.0/dev/StarterGame/Items_LowPolyMan/misc/にセーブしました。

Asset Editorに新規Input bindingが作られているのが確認出来ます。


これから、今作った二つのファイルを使ってキャラクターを動かすシステム全体を作っていきます。

まずシステムを格納するEntityを作ります。
Entity Outlinerの空白部分でマウス右クリックでメニューを出し、Create entityを実行して新規Entityを作成して下さい。


新規Entityが作成されました。


Entity Inspectorに今作ったEntityの情報が表示されています。ここにScript Canvasファイルの為のコンポーネントを追加します。
Add Componentをクリックして下さい。


表示される一覧の中のScript Canvasをクリックします。


EntityにScript Canvasコンポーネントが追加されました。


Script CanvasコンポーネントのBrowseアイコンをクリックしてファイルブラウザを出し、先程作成したスクリプトファイルをロードします。


Script Canvasコンポーネントにスクリプトファイルがロードされました。ファイルへのパスが表示されています。


次にInput Bindingsの為のコンポーネントを追加します。
再びAdd Componentをクリックし、一覧からInputを選びます。


EntityにInputコンポーネントが追加されました。


InputコンポーネントのBrowseアイコンをクリックしてファイルブラウザを出し、先程作成したInput bindingsのファイルをロードします。


InputコンポーネントにInput Bindingsのファイルがロードされました。ファイルへのパスが表示されています。


以上でEntityへのコンポーネントの追加は終了です。

これからInput bindingsを編集し、ゲームパッドのボタンにイベントを割り当てて行きます。

まずゲームパッドを用意してPCと接続しておきます。
今回はLogicool F310を使いました。


Inputコンポーネントのジョイスティックアイコンをクリックして下さい。Asset EditorでInput Bindingsが開きます。

(注・Asset EditorはTools-Asset Editorでも開けますが、その場合はAsset EditorのFileメニューから手動でInput Bindingをロードして下さい。)

Asset EditorにInput bindingが表示されています。
InputEventGroupsのAdd new child elementアイコンをクリックします。


Unspecified Eventという項目が追加されます。

今追加されたのは、ボタン入力一つに対応するイベントです。
イベントの処理の中身は後でスクリプトに書いて行きます。ここではイベント名と使用ボタンを定義しましょう。

Unspecified Eventの左の三角部分をクリックして展開して下さい。Event Nameの入力欄が表示されます。


ここに任意のイベント名を入力します。
ボタンを押した時にパンチモーションを出す事にしたいので、イベント名は分かりやすくpunchとしました。


次はこのイベントで使用するボタンを指定します。
Event GeneratorsのAdd new child elementアイコンをクリックします。


Class to createウィンドウが出ますので、プルダウンからInputを選び(といっても現在はそれしか項目がありませんが…)、OKをクリックして下さい。


インプットするボタンの項目が追加されました。


デフォルトではこの様にgamepad_button_aが割り当てられていますが、プルダウンから他のボタンを選択出来ます。
ゲームパッドのXボタンに割り当てたかったので、プルダウンからgamepad_button_xを選択しました。


ここで一度セーブしておきましょう。Asset EditorのFile - Saveを実行してセーブします。


今回はモーション3つ(パンチ・膝上げ・アーチ)を用意したので、残り二つのモーションの為に同じ手順でイベントを用意しました。

イベント名はkneeLiftとarchとし、入力はそれぞれAボタンとBボタンを割り当てました。

作業が終わったら、Asset EditorのFile - Saveを実行してセーブします。
セーブしないと編集したInput Bindingsが有効にならないので注意して下さい。

次は、各イベントの為のスクリプトの作成です。
Script CanvasコンポーネントのOpen in script canvas editorアイコンをクリックします。


該当するスクリプトファイルがScript Canvasウィンドウで開きます。

(注・Script CanvasはTools - Script Canvas(PREVIEW) でも開けますが、その場合はScript CanvasのFile - Openでスクリプトファイルを手動でロードして下さい。)

Script Canvasでは、ノードを作成しそれを接続する事でスクリプトを作ります。やってみましょう。

ウィンドウ左カラムに各ノードがカテゴリ分けされています。
その中にあるGameplayを展開して内容を表示し、そこから更にInputを展開すると、Input Handlerというノードが入っています。


そのInput Handlerを、タブウィンドウ内にドラッグ&ドロップします。
Input Handerノードが生成されます。


Event Nameに、先程Input bindingsで作ったイベント名を一つ入力します。ここではpunchイベントの為の処理を作る事にして、punchと入力します。
イベント名を間違えると処理が動かないので気を付けて下さい。


キャラクターモデルを表すノードを作成します。
まずEntity OutlinerでキャラクターのEntityを選択します。


次にScript Canvasでマウス右クリックでメニューを出し、Reference Selected Entityを実行します。


キャラクターのノードが生成されました。


Anim Graphからパラメータの値(float)を取得するノードを作成します。
(Anim Graphを作成した時に、モーションのフローを制御する為のパラメータを追加したのを憶えていますでしょうか?)
使うのはSetNamedParameterFloatというノードですが、これはデフォルト設定では非表示になっていますので、まず設定を変更します。
Edit - Settings - Global Preferencesでプリファレンスを表示して下さい。


Show nodes excluded from previewにチェックを入れてOKします。


ウィンドウ左カラムにあるノードのカテゴリ一覧の項目が増えました。


ノードのカテゴリ一覧からAnimation - Anim Graph - SetNamedParameterFloatをタブウィンドウ内にドラッグ&ドロップします。


SetNamedParameterFloatノードが生成されます。


Anim Graphのパラメータは二つあり、モーションの流れは行きと帰りがあるので、SetNamedParameterFloatノードは4つ必要です。
SetNamedParameterFloatノードをコピー&ペーストか複製(Ctrl + D)して4つに増やします。


ではここから各ノードを接続して行きましょう。
まず全体の流れを作ります。
Input HandlerのHoldの横の三角をマウスでドラッグすると青い点線が出ます。
ドラッグしたままSetNamedParameterFloatのInの横の三角にドロップすると白線になり、接続が完了します。これで、ゲームパッドのボタンをホールドした時に処理が流れる様になります。


同じやり方で他のノードも下図の様に接続して下さい。
下の二つは図の様にReleasedから接続します。これで、ボタンを離した時に処理が流れる様になります。


これで全体の流れが出来ました。

次に、各ノードの値を下図の通りに設定して行きます。
・四つSetNamedParameterFloatのString:1それぞれに、Anim Graphに作ったパラメータ名である"Select"と"Go"を入力します。
・各SetNamedParameterFloatのNumber:2には、各パラメータにセットする値を入れます。
これはMotion Graphで設定した値と同じにします。つまり、
ニュートラルからパンチモーションに入る → Select == 3.0  Go == 1.0
各モーションからニュートラルに戻す →  Select == 0.0  Go == 2.0
です。


EntityRefのGetと各SetNamedParameterFloatのSourceを接続します。
これで、EntityRefが参照しているキャラクターモデルのAnim Graphコンポーネントのパラメータを取得する様になります。


以上でパンチモーション用のスクリプト作成は終了です。
Script CanvasのFile - Saveでスクリプトをセーブします。セーブしないと編集したスクリプトが実行可能にならないので注意して下さい。

まだパンチモーションだけですが、とりあえずテストしてみましょう。
Script Canvasを閉じ、Lumberyard Editorに戻って下さい。


Lumberyard EditorでGame - Play Gameを実行します。
Perspectiveビューでゲームが実行されます。
キャラクターモデルが、以前Anim Graphで設定した通りニュートラルモーションになります。


ゲームパッドのXボタンを押してホールドします。
キャラクターモデルがパンチモーションになります。


ゲームパッドのXボタンを離します。
キャラクターモデルがニュートラルモーションに戻ります。


キーボードのESCボタンを押してゲームを終了します。エディタに戻りました。


テストが上手く行ったので、Script Canvasを開いてスクリプトの残りを作成します。
Script Canvasで先程作業したスクリプトファイルを開きます。
(以前書いた通り、スクリプトのEntityを選択しておき、Entity InspectorのScript CanvasコンポーネントのOpen in Script Canvas Editorアイコンをクリックするとすぐに開けます。Tools - Script Canvas(PREVIEW) でも開けますが、その場合はScript CanvasのFile - Openでスクリプトファイルを手動でロードして下さい。)


先程作成したスクリプト全体をドラッグして選択します。


Edit - Duplicateで複製します(ショートカットCtrl+d)。

これをアーチモーション用に改造します。

複製した方のInput HandlerのEventNameをarchに、Hold側の最初のSetNamedParameterFloatのNumber:2を1.0にします。(これは以前Anim Graphでアーチモーション用Transitionの条件式に設定した値です。)


もう一度同様に、最初に作ったスクリプト部分を選択して複製し、それを膝上げモーション用に改造します。
複製した方のInput HandlerのEventNameをkneeLiftに、Hold側の最初のSetNamedParameterFloatのNumber:2を2.0にします。(これは以前Anim Graphで膝上げモーション用Transitionの条件式に設定した値です。)
下図の様になれば完成です。


Script CanvasのFile - Saveでスクリプトをセーブします。セーブしないと編集したスクリプトが実行可能にならないので注意して下さい。

もう一度テストしてみましょう。
Aボタンで膝上げモーション、Bボタンでアーチモーションが再生される様になりました。




テストが終わったらキーボードのESCボタンでゲームを抜け、Lumberyard EditorのFile - Saveでセーブします。

もしLumberyardを終了する場合は、編集中のファイルがあればセーブしておかなくてはなりません。
終了前に以下を確認してください。
・Lumberyard EditorのFile - Saveでレベルをセーブ
・Asset EditorのFile - SaveでInput bindingをセーブ
・Script CanvasのFile - Saveでスクリプトファイルをセーブ
・Animatio EditorでAnim Graphとモーションセットを各View内のSaveアイコンからセーブ

次回はキャラクターを移動させてみます。

No comments: