プロジェクトの準備がまだ済んでいない場合は、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.Rigidbody
のAddForce(Vector3 force)を選択 - ノードの種類選択メニューからActionを選択
- ノード名はそのまま
Enter
キーで確定
作成したノードはActionノードと言い、単純な処理を行うためのノードです。
今回の場合は、Rigidbody.AddForceが実行されます。
Rigidbody.AddForceを実行したあとに次のノードへすぐに遷移しますが、今回は何も接続していないためここで実行は終了します。
Membersタブの[Unselected]となっているドロップダウンはスクリプトを作成するアセンブリ(場所)の設定です。
[Unselected]のままノードを作成した場合はデフォルトのLogicToolkitGeneratedScriptsという名前のアセンブリが作成されます。
通常はデフォルトの名前のままで問題ありません。
Vector3.operator *ノードの作成
Rigidbodyに力を加えるための3次元ベクトルを計算します。
- Rigidbody.AddForceのForceフィールドの入力ポートをポートの左側付近(接続先ノードを作成したい位置)までドラッグ&ドロップし、ノード作成メニューを開く
- Membersタブを選択
- 検索欄に
*
と入力 - 一覧から
UnityEngine.Vector3
のoperator *(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.Vector3
のnew Vector3(float x, float y, float z)を選択 - ノードの選択メニューからComputeを選択
- ノード名はそのまま
Enter
キーで確定
Input.GetAxisノードの作成
水平方向の入力値を取得します。
- new Vector3ノードのXフィールドの入力ポートを左側付近(接続先ノードを作成したい位置)までドラッグ&ドロップし、ノード作成メニューを開く
- Membersタブを選択
- 検索欄に
Input GetAxis
と入力 - 一覧から
UnityEngine.Input
のGetAxis(string axisName)を選択 - ノードの種類選択メニューからComputeを選択
- ノード名はそのまま
Enter
キーで確定
Input.GetAxisノードの編集
水平入力を出力するように設定します。
- Axis Nameフィールドの文字列を
Horizontal
に設定
Input.GetAxisノードのコピー&ペースト
垂直入力を受け渡すノードは既存ノードのコピー&ペーストで作成してみましょう。
- すでにあるInput.GetAxisのComputeノードを選択
- コピーする
- Windows:
Ctrl
+C
- Mac:
Cmd
+C
- Windows:
- 水平入力用ノードの下側付近にマウスカーソルを移動する
- ペーストする
- Windows:
Ctrl
+V
- Mac:
Cmd
+V
- Windows:
ノードの右クリックメニューでもコピー&ペーストできます。
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に投稿する場合はこちら。