2. Main Cameraの挙動作成

前回までの作業がまだ済んでいない場合は、3D玉転がしゲームの作成方法から前回までのチュートリアルを先に済ませてください。

Playerが移動できるようになりましたがカメラが追従しないため非常に見づらいです。
Main CameraがPlayerに追従するように挙動を作成しましょう。

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

  • PlayerとMain Cameraの相対位置Offsetを最初に保持しておき、毎フレームPlayerの位置にOffsetを加算した位置にMain Cameraの座標に設定する。
  • 開始時にPlayerのTransform.positionとMain CameraのTransform.positionとの相対ベクトルを計算し、変数Offsetに設定
  • LateUpdateでPlayerのTransform.positionに変数Offsetを加算した位置にMain CameraのTransform.positionを設定する。
  • 挙動の作成にはLogic Behaviorを使用する。

Main CameraにLogic Behaviorを追加

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

Main CameraのLogic Behaviorを編集

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

Offset変数の作成

PlayerとMain Cameraの相対位置を格納するための変数を作成します。

  • サイドパネルのBlackboardタブを選択
  • Localタブを選択
  • 変数リストの「+」ボタンをクリック
  • 変数の型リストからBuiltin/Vector3を選択
  • 名前にOffsetを入力して確定。

Blackboardとは様々な種類の変数(値を格納しておき、後から参照するための機能)を保持するための機能です。
Localタブでは他グラフからは参照しない変数を作成できます。
今回はグラフ内でのみ使用する変数のためLocalタブで作成しています。

変数の型のVector3は3次元ベクトルです。
つまり「グラフ内でのみ使用する3次元ベクトルを格納するためのOffset変数を作成した」ことになります。

名前を間違ってしまった場合は、名前欄を右クリックしRenameを選択するか、名前欄をダブルクリックすることでリネームできます。

Offset変数の設定ノード作成

Offset変数を設定するノードを作成します。

  • サイドパネルのBlackboardタブにあるOffset変数の名前部分をグラフ上のStartノードの右側付近(ノードを作成したい位置)にドラッグ&ドロップし、ノード作成メニューを開く。
  • ノード作成メニューからSet Variable (Action)を選択
  • ノード名はそのままEnterキーで確定

StartノードとOffset設定ノードを接続

開始時にOffsetの値を設定するように実行ポートを接続します。

  • Startノードの実行ポートをSet Variableノードに接続。

Vector3.operator -ノードの作成

PlayerとMain Cameraの位置を減算することで相対ベクトルを求めます。

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

Get Transform.positionノードの作成

自オブジェクト(Main Camera)の位置を取得するノードを作成します。

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

設定は最初から自オブジェクトの座標を取得するようになっています。

Get Transform.positionノードをコピー&ペースト

Playerの座標も取得したいため、Trasnform.positionのノードをもう一つ用意するため、コピー&ペーストします。

  • すでにあるGet Transform.positionのComputeノードを選択
  • コピーする
    • Windows: Ctrl + C
    • Mac: Cmd + C
  • 下側付近にマウスカーソルを移動する
  • ペーストする
    • Windows: Ctrl + V
    • Mac: Cmd + V

下のGet Transform.positionの編集

Playerの座標を取得するように設定します。

  • HierarchyウィンドウのPlayerオブジェクトを下のGet Trasform.positionのTargetフィールドにドラッグ&ドロップ

Playerの位置のポート接続

Playerの位置をVector3.operator -のBフィールドに受け渡すようにポート同士を接続します。

  • Playerの方のGet Trasnform.positionのPositionポートをVector3.operator -のBフィールドのポートにドラッグ&ドロップ

Late Updateノードの作成

開始時のOffsetの設定ができたため、毎フレームの更新で追従する機能を作成していきます。

  • Startノード関連のまとまりよりも下側のグラフ上でSpaceキーを押し、ノード作成メニューを開く
  • Scriptsタブを選択
  • 一覧からEvents/Late Updateを選択
  • ノード名はそのままEnterキーで確定

Set Transform.positionノードの作成

Main Cameraの位置を設定するノードを作成します。

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

Vector3.operator +ノードの作成

「Playerの位置+Offset=Main Cameraの位置」となるように計算するための加算ノードを作成します。

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

PlayerのGet Trasform.positionノードをコピー&ペースト

PlayerのGet Transform.positionノードはすでに作成してありますので、コピー&ペーストします。

  • Playerに設定してある方のGet Transform.positionのComputeノードを選択
  • コピーする
    • Windows: Ctrl + C
    • Mac: Cmd + C
  • Vector3.operator+ノードの左側付近にマウスカーソルを移動する
  • ペーストする
    • Windows: Ctrl + V
    • Mac: Cmd + V

コピーせずに、すでにあるGet Transform.positionからそのまま接続することもできます。
今回は「Startのまとまり」と「Late Updateのまとまり」を区別しやすくするためにコピーしています。

Playerの位置のポート接続

Playerの位置をVector3.operator +のAフィールドに受け渡すようにポート同士を接続します。

  • Playerの方のGet Trasnform.positionのPositionポートをVector3.operator +のAフィールドのポートにドラッグ&ドロップ

Offset変数の取得ノードを作成

Offset変数の値を取得するノードを作成します。

  • Vector3.operator +のBフィールドの入力ポートを左側付近(接続先ノードを作成したい位置)までドラッグ&ドロップし、ノード作成メニューを開く。
  • Scriptsタブを選択
  • 検索欄にOffsetと入力
  • 一覧からOffset [Get] (Compute)を選択

このようにノード作成メニューのScriptsタブからも変数にアクセスできます。
お好みで使い分けてみてください。

変数値取得用のComputeノードはコンパクトな見た目になっていますが、機能的には他のComputeノードと変わりありません。

Main Cameraの動作確認

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

一度プレイ開始してMain Cameraの挙動を確認します。

  • プレイヤーの移動に追従するようにMain Cameraの位置が更新されることを確認

次回

次回は3. Itemの挙動作成を行います。

完了を投稿

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