2. Ballの挙動作成

前回までの作業がまだ済んでいない場合は、ブロック崩しの作成方法から前回までのチュートリアルを先に済ませてください。

ここでは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.TransformSetParent(Tranform parent, bool worldPositionStays)を選択
  • ノードの種類選択メニューからActionを選択

Transform.SetParentノードの編集

Rigidbody.isKinematicノードの作成

初期状態ではRigidbodyのIs Kinematicが有効になっています。
ボールは移動開始と同時に壁やブロックなどに当たった際に物理的な反射を行ってほしいため、Is Kinematicを無効に切り替えます。

  • Transform.SetParentノードの遷移ポートをドラッグ&ドロップし、ノード作成メニューを開く
  • Membersタブを選択
  • 検索欄にRigidbody isKinematicと入力
  • 一覧からUnityEngine.RigidbodyisKinematic [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.Vector3operator *(Vector3 a, float d)を選択
  • ノードの種類選択メニューからComputeを選択

Vector3.operator *ノードの編集

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

Vector3.normalizedノードの作成

  • Vector3.operator *ノードのAフィールドの入力ポートをドラッグ&ドロップし、ノード作成メニューを開く
  • Membersタブを選択
  • 検索欄にnormalizedと入力
  • 一覧からUnityEngine.Vector3normalized [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.PubOnCollisionEnterCallbackを選択
  • ノードの種類選択メニューから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.Vector3operator -(Vector3 a, Vector3 b)を選択
  • ノードの種類選択メニューからComputeを選択

Transform.positionノードの作成

  • Vector3.operator -ノードのAフィールドの入力ポートをドラッグ&ドロップし、ノード作成メニューを開く
  • Membersタブを選択
  • 検索欄にTransform positionと入力
  • 一覧からUnityEngine.Transformposition [Get]を選択
  • ノードの種類選択メニューからComputeを選択

Collision.transformノードの作成

  • PubOnCollisionEnter.CallbackノードのArg 0フィールドの出力ポートを先ほど作成したTransform.positionノードよりも下側へドラッグ&ドロップし、ノード作成メニューを開く
  • Membersタブを選択
  • 一覧からCollision/transform [Get]を選択
  • ノードの種類選択メニューからComputeを選択

Transform.positionノードをもう一つ作成

  • Collision.transformノードのTransformフィールドの出力ポートをドラッグ&ドロップし、ノード作成メニューを開く
  • Membersタブを選択
  • 検索欄にpositionと入力
  • 一覧からUnityEngine.Transformposition [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に投稿する場合はこちら。