前回までの作業がまだ済んでいない場合は、ブロック崩しの作成方法から前回までのチュートリアルを先に済ませてください。
ここではBallの挙動を作成します。
開始時にボールを斜め方向に移動開始し、Playerと衝突時には接触位置によって跳ね返り方向を調整する処理を実装します。
BallにLogic Behaviorの追加
- Player/Ball SocketsにあるBallオブジェクトを選択
- InspectorウィンドウのAdd Componentボタンをクリック
- Logic Toolkit/Logic Behaviorを選択してLogic Behaviorコンポーネントを追加
- Logic BehaviorのEditボタンをクリックし、Logic Editorウィンドウを開く
BallのLogic Behaviorを編集
Transform.SetParentノードの作成
後々キー操作によって移動開始を行うようにするため、初期状態ではPlayerと連動して動く設定になっています。
移動開始した際にPlayerの子からルート直下に変更するためTransform.SetParent
で親オブジェクトを変更します。
- Startノードの実行ポートをドラッグ&ドロップし、ノード作成メニューを開く
- Membersタブを選択
- 検索欄に
Transform SetParent
と入力 - 一覧から
UnityEngine.Transform
のSetParent(Tranform parent, bool worldPositionStays)を選択 - ノードの種類選択メニューからActionを選択
Transform.SetParentノードの編集
- ParentフィールドのモードをValueに変更
- World Position Staysフィールドにチェック
Rigidbody.isKinematicノードの作成
初期状態ではRigidbodyのIs Kinematicが有効になっています。
ボールは移動開始と同時に壁やブロックなどに当たった際に物理的な反射を行ってほしいため、Is Kinematicを無効に切り替えます。
- Transform.SetParentノードの遷移ポートをドラッグ&ドロップし、ノード作成メニューを開く
- Membersタブを選択
- 検索欄に
Rigidbody isKinematic
と入力 - 一覧から
UnityEngine.Rigidbody
のisKinematic [Set]を選択 - ノードの種類選択メニューからActionを選択
デフォルトでIs Kinematicフィールドのチェックが外れているため、設定を変更する必要はありません。
Rigidbody.linearVelocityノードの作成
- Rigidbody.isKinematicノードの遷移ポートをドラッグ&ドロップし、ノード作成メニューを開く
- Scriptsタブを選択
- Actions/LogicToolkitGeneratedScripts/UnityEngine/Rigidbody/Set Rigidbody.linearVelocity (Action)を選択
Set Rigidbody.linearVelocityスクリプトはPlayerの挙動作成で作成済みのため、Scriptsタブからも選択できるようになっています。
もちろんMembersタブで同じメンバーを選択しても同じスクリプトが使用されますので、お好みで使い分けてください。
Vector3.operator *ノードの作成
- Rigidbody.linearVelocityノードのLinear Velocityフィールドの入力ポートをドラッグ&ドロップし、ノード作成メニューを開く
- Membersタブを選択
- 検索欄に
*
と入力 - 一覧から
UnityEngine.Vector3
のoperator *(Vector3 a, float d)を選択 - ノードの種類選択メニューからComputeを選択
Vector3.operator *ノードの編集
- Dフィールドの値を
8
に設定
Vector3.normalizedノードの作成
- Vector3.operator *ノードのAフィールドの入力ポートをドラッグ&ドロップし、ノード作成メニューを開く
- Membersタブを選択
- 検索欄に
normalized
と入力 - 一覧から
UnityEngine.Vector3
のnormalized [Get]を選択 - ノードの種類選択メニューからComputeを選択
Vector3.normalizedノードの編集
- TargetフィールドのX値を
1
に設定 - TargetフィールドのY値を
1
に設定
new Vector3
ノードを作成する必要なくフィールドに固定値を直接設定できます。
グループをまとめる(任意)
開始直後に斜め方向に移動開始する挙動を実装できました。
Startノードから繋がるノードをグループノードでまとめてみましょう。
- Startノードから繋がるノードのみをすべて選択した状態で、
Gキー
を押しグループノードを作成 - グループノード名を
Start moving the ball
に変更 - グループノードをマウスオーバーした際に表示される
...
アイコンをクリック - コメントに
The ball begins to move when play begins.
と入力
PubOnCollisionEnter.Callbackノードの作成
ここからはPlayerに接触した場合にパドルとボールの位置関係から反射方向を調整する処理を実装します。
- Startノードよりも下の方で
Spaceキー
を押し、ノード作成メニューを開く - Membersタブを選択
- 検索欄に
OnCollisionEnter Callback
と入力 - 一覧からの
LogicToolkit.Builtin.Messages.PubOnCollisionEnter
のCallbackを選択 - ノードの種類選択メニューからEventを選択
LogicToolkit.Builtin.Messages名前空間の型はMonoBehaviorのメッセージが呼ばれた際に、UnityEventを介して他のメソッドを呼び出すための組み込みコンポーネントです。
今回はOnCollisionEnter(Collision)メッセージをLogic Toolkitのイベントとして受け付けるように使用しています。
PubOnCollisionEnter.Callbackノードの編集
- TargetフィールドのRequireをチェック
TargetフィールドはInputComponent<PubOnCollisionEnter>
型のフィールドです。
Requireフィールドにより、対象オブジェクトに該当コンポーネントがない場合に追加してから取得する機能が備わっています。
今回はRequireをチェックするため、自オブジェクト(Ball)にPubOnCollisionEnterコンポーネントを追加していなくても実行時に追加するようなります。
オブジェクトの用途によってはその都度追加する分の処理負荷が問題になる場合もあります。
事前にオブジェクトにコンポーネントを追加しておくかどうかは検討したほうが良いでしょう。
Collision.gameObjectノードの作成
- PubOnCollisionEnter.CallbackノードのArg 0フィールドの出力ポートをドラッグ&ドロップし、ノード作成メニューを開く
- Membersタブを選択
- 一覧からCollision/gameObject [Get]を選択
- ノードの種類選択メニューからComputeを選択
GameObject.CompareTagノードの作成
- Collision.gameObjectノードのGame Objectフィールドの出力ポートをドラッグ&ドロップし、ノード作成メニューを開く
- Membersタブを選択
- 一覧からGameObject/CompareTag(string tag)を選択
- ノードの種類選択メニューからComputeを選択
GameObject.CompareTagノードの編集
- Tagフィールドの文字列を
Player
に設定
Branchノードの作成
- GameObject.CompareTagノードのResultフィールドの出力ポートをドラッグ&ドロップし、ノード作成メニューを開く
- Scriptsタブを選択
- 一覧からFlow Controls/Branchを選択
Branchノードへの接続
- PubOnCollisionEnter.Callbackノードの実行ポートからBranchノードの入力ポートにドラッグ&ドロップして接続
Rigidbody.linearVelocityノードの作成
- BranchノードのTrueフィールドの実行ポートをドラッグ&ドロップし、ノード作成メニューを開く
- Scriptsタブを選択
- 検索欄に
Rigidbody linearVelocity
と入力 - 一覧からSet Rigidbody.linearVelocity (Action)を選択
Vector3.operator *ノードの作成
- Rigidbody.linearVelocityノードのLinear Velocityフィールドの入力ポートをドラッグ&ドロップし、ノード作成メニューを開く
- Scriptsタブを選択
- 検索欄に
*
と入力 - 一覧からVector3.operator *(Vector3 a, float d) (Compute)を選択
Vector3.operator *ノードの編集
- Dフィールドの数値を
8
に設定
Vector3.normalizedノードの作成
- Vector3.operator *ノードのAフィールドの入力ポートをドラッグ&ドロップし、ノード作成メニューを開く
- Scriptsタブを選択
- 検索欄に
normalized
と入力 - 一覧からGet Vector3.normalized (Compute)を選択
Vector3.operator -ノードの作成
- Vector3.normalizedノードのTargetフィールドの入力ポートをドラッグ&ドロップし、ノード作成メニューを開く
- Membersタブを選択
- 検索欄に
-
と入力 - 一覧から
UnityEngine.Vector3
のoperator -(Vector3 a, Vector3 b)を選択 - ノードの種類選択メニューからComputeを選択
Transform.positionノードの作成
- Vector3.operator -ノードのAフィールドの入力ポートをドラッグ&ドロップし、ノード作成メニューを開く
- Membersタブを選択
- 検索欄に
Transform position
と入力 - 一覧から
UnityEngine.Transform
のposition [Get]を選択 - ノードの種類選択メニューからComputeを選択
Collision.transformノードの作成
- PubOnCollisionEnter.CallbackノードのArg 0フィールドの出力ポートを先ほど作成したTransform.positionノードよりも下側へドラッグ&ドロップし、ノード作成メニューを開く
- Membersタブを選択
- 一覧からCollision/transform [Get]を選択
- ノードの種類選択メニューからComputeを選択
Transform.positionノードをもう一つ作成
- Collision.transformノードのTransformフィールドの出力ポートをドラッグ&ドロップし、ノード作成メニューを開く
- Membersタブを選択
- 検索欄に
position
と入力 - 一覧から
UnityEngine.Transform
のposition [Get]を選択 - ノードの種類選択メニューからComputeを選択
データポートの接続
- Vector3.operator -ノードのBフィールドの入力ポートから最後に作成したTransform.positionノードのPositionフィールドの出力ポートにドラッグ&ドロップして接続
グループにまとめる(任意)
OnCollisionEnterから繋がるノードをグループノードでまとめましょう。
- PubOnCollisiionEnter.Callbackノードから繋がるノードのみをすべて選択した状態で、
Gキー
を押しグループノードを作成 - グループノード名を
OnCollisionEnter
に変更 - グループノードをマウスオーバーした際に表示される
...
アイコンをクリック - コメントに
Correct the bounce direction when the Ball hits the Player
と入力
Speedの変数化(任意)
Playerと同様移動速度を変数化しておくと後々便利です。
- サイドパネルのBlackboardタブを選択
- Rootタブを選択
- +ボタンをクリックし、型選択メニューを開く
- 一覧からPrimitive/floatを選択
- 名前を
Speed
に設定 - 数値を
8
に設定 - Speed変数をグラフのStartノード側のVector3.operator *ノードのDフィールド付近にドラッグ&ドロップし、ノード作成メニューを開く
- Get Variable (Compute)を選択
- Speed取得ノードの出力ポートからVector3.operator *ノードのDフィールドの入力ポートへドラッグ&ドロップして接続
- OnCollisionEnter.Callbackノード側にも同様にVector3.operator *ノードのDフィールド付近にドラッグ&ドロップし、ノード作成メニューを開く
- Get Variable (Compute)を選択
- Speed取得ノードの出力ポートからVector3.operator *ノードのDフィールドの入力ポートへドラッグ&ドロップして接続
Ballの挙動確認
ここまで作成するとグラフは以下のようになっています。
プレイ開始してBallの挙動を確認します。
- プレイ開始と同時に右上方向に移動開始することを確認
- Player(水色のパドル)に当たった場合、当たった位置によって反射角度が異なることを確認
- パドルの左側に当たった場合は左方向に反射
- パドルの右側に当たった場合は右方向に反射
次回
次回は3. Blockの挙動作成を行います。
完了を投稿
ここまでの作業完了をSNSに投稿する場合はこちら。