[Unity] Visual Scripting でつくる電車ゲーム No.2 切替ポイントを作る

11月 9, 2023 | ALL, Unity, ビジュアルスクリプティング

電車ゲームをつくるNo.1の続きを始めましょう。今回追加するのは、鉄道で重要な切替ポイントです。Cinemachineには、切り替えシステムはありません。また、Cinemachineは物理的な線路ではないので、線路を切り替えるには、プログラムで制御するしかありません。

環境

・Intel Mac
・Unity 2022.3.12f1

Cinemachineで切替線路を作る

まず、切り替え先のCinemachine Pathをつくります。

Cinemachine Dolly Cart を作る

空のゲームオブジェクトをつくります。

Cinemachine Dolly Cart を作る

オブジェクト名を「CinemachinePath02」とします。次にCinemachine Pathコンポーネントを追加します。

Cinemachine Dolly Cart を作る

Cinemachine Path が出来上がったら、次の作業に移ります。
切り替えのON・OFFを指定できるようUIトリガーを設置しましょう。

Cinemachine Dolly Cart を作る

ここではToggle01という名前にしてあります。

Cinemachine Dolly Cart を作る

配置は速度調整のスライダーの上にしました。

Cinemachine Dolly Cart を作る

切り替えポイントのトリガーとして使うオブジェクトを配置する

今回の線路は、物理的な線路ではないため、切り替え位置の取得はできません。そのため、切り替え位置をゲームオブジェクトをつかって判別しています。切り替えポイントにオブジェクトを配置します。この位置と、後に設定する切り替え後のPath上での位置を指定する数値によって切り替えを行っています。この2つのバランスが悪いと切替後にワープしたように不自然な切り替えになります。

Cinemachine Dolly Cart を作る
Cinemachine Dolly Cart を作る

切り替えをコントロールするVisual Scriptをつくる

それでは、スクリプトをVisual Scriptをつかって作っていきます。今回はオリジナルノードを作ることもしていきます。

まず、↓のスクリプトをつくります。
このオリジナルノードは、切り替えポイントに置かれたゲームオブジェクト名を受け取り、そこから切り替え先のChinemathine Path名と情報取得に使う要素番号を返します。
今回の切り替えシステムは、電車の切り替え後の位置、反応すべきトグル、切替後のChinemathine Path名などをすべて配列で管理しています。配列の要素番号は、今回作るオリジナルノードが切り替えポイントに配置されたオブジェクトのオブジェクト名から返り値として返します。


using System.Collections.Generic;
using Unity.VisualScripting;

public class VSSwitchPathNode : Unit
{
  [DoNotSerialize]
   public ControlInput inputTrigger;

   [DoNotSerialize]
   public ControlOutput outputTrigger;

   [DoNotSerialize]
   public ValueInput switcherName;

   [DoNotSerialize]
   public ValueInput switchingGoToList;

   [DoNotSerialize]
   public ValueOutput result;

   [DoNotSerialize]
   public ValueOutput resultListNum;

   private string resultValue;
   private int resultListInt;
   protected override void Definition()
   {
       inputTrigger = ControlInput("inputTrigger", (flow) =>
       {
           string switcherNameWk = flow.GetValue(switcherName);
           int ListNum = int.Parse(switcherNameWk.Substring(1,1));
           List switchingGoToListWk = flow.GetValue>(switchingGoToList);
           resultValue = switchingGoToListWk[ListNum - 1];
           resultListInt = ListNum - 1;
           return outputTrigger;
       });

       outputTrigger = ControlOutput("outputTrigger");

       switcherName = ValueInput("switcherName", "RR ");
       switchingGoToList = ValueInput>("switchingGoToList");
       result = ValueOutput("result", (flow) => resultValue);
       resultListNum = ValueOutput("resultListNum", (flow) => resultListInt);

       Requirement(switcherName, inputTrigger); //ノードの処理に myValueA の値の設定が必要であることを表示するため。
       Requirement(switchingGoToList, inputTrigger); //ノードの処理に myValueB の値の設定が必要であることを表示するため。
       Succession(inputTrigger, outputTrigger); //入力トリガーポートの入力が出力トリガーポートの出口から出ることを表示するため。
                                                //Succession を設定しないと接続されたノードがグレー表示されますが、実行はされます。
       Assignment(inputTrigger,result);//inputTrigger が結果の文字列出力にトリガーされた時に記述されたデータを表示するため。
       Assignment(inputTrigger,resultListNum);//inputTrigger が結果の文字列出力にトリガーされた時に記述されたデータを表示するため。
   }
}
新しく作ったオリジナルノードはそのままではGraphのなかで使うことはできません。
Edit -> Project Settings -> Visual Scripting を開き、「Generate」を押してください。
GenerateすることによりGraphの中で検索、使用することができるようになりま。
Cinemachine Dolly Cart を作る
↓のようにスクリプトを作成しましょう。
同時に様々な情報が入っている変数も作成しましょう。
変数名
Speed
Resistance
Acceleration Slider
ChinemachinePath02
ChinemachinePath01
SwitchingGoToList
SwitchingGoToPosition
ToggleR1
Float
Float
Game Object
Game Object
Game Object
List of String
List of Float
List of Toggle
説明
電車のスピードを格納
電車に生じる抵抗値を格納
電車をコントロールするUIスライダーを格納
Cinemachine Path の一つを格納
Cinemachine Path の一つを格納
切り替え後にどのCinemachine Pathに行くかPath名を格納
切替後に線路のどの位置に移動するかを格納
切り替えのOn/Offを管理するトグルのどのトグルを見ればいいかを格納
Cinemachine Dolly Cart を作る
Cinemachine Dolly Cart を作る