1. Playerの挙動作成

プロジェクトの準備がまだ済んでいない場合は、3D玉転がしゲームの作成方法から先に準備を済ませてください。

ここではPlayer(水色の球)の挙動を作成します。

作成する内容は以下の通りです。

  • 水平入力と垂直入力(WASDキーや矢印キー)によってPlayerオブジェクトのRigidbodyを移動させる。
  • 移動処理を行うのはFixedUpdate。
  • 入力には Input.GetAxis("Horizontal")Input.GetAxis("Vertical") を使用する。
  • Rigidbodyの移動は Rigidbody.AddForce で力を加える。
  • 挙動の作成にはLogic Behaviorを使用する。

PlayerにLogic Behaviorを追加

  • Playerオブジェクトを選択
  • InspectorウィンドウのAdd Componentボタンをクリック
  • コンポーネントメニューからLogic Toolkit/Logic Behaviorを選択
  • Logic BehaviorコンポーネントのEditボタンをクリックし、Logic Editorウィンドウを開く

PlayerのLogic Behaviorを編集

Logic EditorウィンドウでPlayerのLogic Behaviorを編集していきます。

FixedUpdateノードの作成

Rigidbodyに力を加えるのに適しているのはFixedUpdateのタイミングなので、FixedUpdateノードを使用します。

  • グラフ上をクリックしフォーカスする
  • Spaceキーを押し、ノード作成メニューを開く
  • Scriptsタブを選択
  • 一覧からEvents/Fixed Updateを選択
  • ノード名はそのままEnterキーで確定

作成したノードはEventノードと言い、他のノードを実行する起点となるノードです。
今回はPlayerオブジェクトのFixedUpdateが呼ばれるときに、接続先ノードが実行されます。

Rigidbody.AddForceアクションの作成

Logic Toolkitのスクリプト生成機能を使用してRigidbody.AddForceメソッドを呼び出すノードを作成します。

  • Fixed Updateノードの実行ポートをノードの右側付近(実行先ノードを作成したい位置)までドラッグ&ドロップし、ノード作成メニューを開く
  • Membersタブを選択
  • 検索欄にRigidbody AddForceと入力
  • 一覧からUnityEngine.RigidbodyAddForce(Vector3 force)を選択
  • ノードの種類選択メニューからActionを選択
  • ノード名はそのままEnterキーで確定

作成したノードはActionノードと言い、単純な処理を行うためのノードです。
今回の場合は、Rigidbody.AddForceが実行されます。
Rigidbody.AddForceを実行したあとに次のノードへすぐに遷移しますが、今回は何も接続していないためここで実行は終了します。

Membersタブの[Unselected]となっているドロップダウンはスクリプトを作成するアセンブリ(場所)の設定です。
[Unselected]のままノードを作成した場合はデフォルトのLogicToolkitGeneratedScriptsという名前のアセンブリが作成されます。
通常はデフォルトの名前のままで問題ありません。

Vector3.operator *ノードの作成

Rigidbodyに力を加えるための3次元ベクトルを計算します。

  • Rigidbody.AddForceのForceフィールドの入力ポートをポートの左側付近(接続先ノードを作成したい位置)までドラッグ&ドロップし、ノード作成メニューを開く
  • Membersタブを選択
  • 検索欄に*と入力
  • 一覧からUnityEngine.Vector3operator *(Vector3 a, float d)を選択
  • ノードの選択メニューからComputeを選択
  • ノード名はそのままEnterキーで確定

作成したノードはComputeノードと言い、値の計算や受け渡しを行うためのノードです。
Vector3.oeprator *(Vector3 a, float d)はAに入力した3次元ベクトルの各成分にDの数値を掛け合わた結果を返します。
今回は計算結果のVector3をRigidbody.AddForceのForceフィールドに受け渡します。

Vector3.operator *の編集

加える力を今回は10に設定します。

  • Dフィールドの数値を10に設定

new Vector3ノードの作成

力を加える方向ベクトルを作成します。

  • Vector3.operator *のAフィールドの入力ポートを左側付近(接続先ノードを作成したい位置)までドラッグ&ドロップし、ノード作成メニューを開く
  • Membersタブを選択
  • 検索欄にnew Vector3と入力
  • 一覧からUnityEngine.Vector3new Vector3(float x, float y, float z)を選択
  • ノードの選択メニューからComputeを選択
  • ノード名はそのままEnterキーで確定

Input.GetAxisノードの作成

水平方向の入力値を取得します。

  • new Vector3ノードのXフィールドの入力ポートを左側付近(接続先ノードを作成したい位置)までドラッグ&ドロップし、ノード作成メニューを開く
  • Membersタブを選択
  • 検索欄にInput GetAxisと入力
  • 一覧からUnityEngine.InputGetAxis(string axisName)を選択
  • ノードの種類選択メニューからComputeを選択
  • ノード名はそのままEnterキーで確定

Input.GetAxisノードの編集

水平入力を出力するように設定します。

  • Axis Nameフィールドの文字列をHorizontalに設定

Input.GetAxisノードのコピー&ペースト

垂直入力を受け渡すノードは既存ノードのコピー&ペーストで作成してみましょう。

  • すでにあるInput.GetAxisのComputeノードを選択
  • コピーする
    • Windows: Ctrl + C
    • Mac: Cmd + C
  • 水平入力用ノードの下側付近にマウスカーソルを移動する
  • ペーストする
    • Windows: Ctrl + V
    • Mac: Cmd + V

ノードの右クリックメニューでもコピー&ペーストできます。

Input.GetAxisノードの編集

垂直入力を出力するように設定します。

  • Axis Nameフィールドの文字列をVerticalに設定

垂直入力値のポート接続

垂直入力値をnew Vector3のZ値に設定するようにポートを接続します。

  • Verticalの方のInput.GetAxisのReturnフィールドの出力ポートをnew Vector3のZフィールドのポートにドラッグ&ドロップ

実はこの方法では斜め入力を行うと加わる力が大きくなるという問題があります。
new Vector3のOutputポートとVector3.operator*のAポートの接続間にVector3.ClampMagnitudeを挟みベクトルの最大の大きさを1に制限することで解消できます。
気になるようでしたら試してみてください。

Startノードの削除

最初から用意されているStartノードは今回使用しないため、削除してしまいましょう。

  • Startノードを選択
  • Deleteキーを押して選択ノードを削除。

Playerの動作確認

ここまで作成するとグラフは以下のようになっています。

一度プレイ開始してPlayer(水色の球)の挙動を確認します。

  • Aキー左矢印キーで左に移動することを確認
  • Dキー右矢印キーで右に移動することを確認
  • Wキー上矢印キーで奥に移動することを確認
  • Sキー下矢印キーで手前に移動することを確認

この段階では赤い壁や黄色いキューブなどはすり抜けますがこれから実装していきますので問題ありません。

次回

次回は2. Main Cameraの挙動作成を行います。

完了を投稿

ここまでの作業完了をSNSに投稿する場合はこちら。