Unity Visual Scripting

Boltという名前で元々有料でアセットストアで販売されていたのがUnityによる買収で無料化され、Unity2021からはVisual Scripting という名前で標準で組み込まれるようになった。
機能ブロックのノードを線でつないでプロセスを表現するフロータイプのビジュアルプログラミングツールで、C#コーディングの代わりにプログラムの動きを表記できる。

Unity2020まで

Boltパッケージをインポートし、オブジェクトのInspecter ビューから「Add Component」で 「Bolt>Flow Machine」を追加し、Newでフロー(graph)を新規作成する。

Unity2021から

標準で組み込まれているので、オブジェクトのInspecter ビューから「Add Component」で 「Visual Scripting>Script Machine」を追加し、Newでフロー(graph)を新規作成する。



ビジュアルスクリプトの編集

EditGraphで編集画面を開く。

最初からStartとUpdateの2つのイベントが用意されており、C#スクリプトを新規作成した時のvoid Start () やvoid Update() に相当する。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}

C#スクリプトの場合はイベント関数内部に処理したいコードを追加するが、 Visual Scriptingでは、イベントノードに、そのイベントが起きると実行したいプロセスを追加してフローを繋ぐ。
プロセスを行う際にインプットする情報、アウトプットする情報があるときは、そのノードを追加する。

オブジェクトの回転

Updateは、毎フレーム1回なので60FPS。
毎フレーム1度づつY軸周りに回転を行う。

New Input Systemに注意

Unity Starter Assetsは、2020年4月に正式版になった新しい Input Systemを使用する。
New Input SystemパッケージがインポートされInput Systemを切り替える設定変更が行われる。

これにより従来のUnityEngine.InputのAPIを使用するInput Managerが使用できない設定になり UnityEngine.InputのInput.managerを使うノードが使えなくなってしまう。
バックエンド設定を切替えて、旧UnityEngine.Inputも両方使えるように設定できる。
設定は、Project SettingsのPlayer>Other Settings>Active Input Handlingで「Both」に設定する、

これで、New Input Systemと旧Input Managerの両方のAPIが使用できるようになる。
C#スクリプトで新しいInput Systemの関数を使う対応 新しいInput Systemの使用

旧UnityEngine.Inputでイベント発生



接触・近接を検知してアニメーションを再生


接触(まで近接)検知で発生させるイベントを使う。
触れたら消える、光る、回転するなどの処理へつなげることができる。

プレイヤーと接触したときだけなど、特定オブジェクトの接触を判定し条件を限定するには、オブジェクトにつけた「Player」などのタグを見て行う。

扉と検出エリアの作成

BOX2つで、扉と、人を検知する領域としての箱を作る。
検出エリアの方は、Box ColliderのIs Triggerをオンにして接触挙動はなくして検出だけにする。
Mesh Rendererをオフにして、形状を見えなくする。

アニメーションクリップの作成

Window>Animation>Animationを選択する。
Animationウインドウはタブを持ってドッキングできる。


Animationタブが開いたら、動かしたいシーンオブジェクトを選んでTransformを追加する。
回転移動の場合はRotation

グラフ曲線を編集したりタイムライン上のポイントの値を記録して、アニメーションクリップファイルが作成される。

録画ボタンを押して時間位置で座標値を登録する。録画ボタンを押してなくても、数字を変更してエンターすれば記録される。

扉の開閉なら、開方向、閉方向の2つのアニメーションクリップを作成する。
アニメーションクリップ
アニメーターコントローラー
アニメーションクリップをダブルクリックして、Loop Timeのチェックを外し、再生が一回で止まるようにする。

アニメーターコントローラー編集

ドアオブジェクトのアニメーターコントローラーに 作成したアニメーションクリップが入っているが、1個目に作ったクリップが既定となって、Entryからトランジションがついている。
新しくNewStateを作成し、Entryからの既定のトランジションを受けるようにする。
これでプログラム開始で「何もアニメーションしない」NewStateに移行する。

ドアの開・閉2つのアニメーションクリップを消した場合はAssetsからドラッグドロップして入れておく。

ScriptMachine追加

VisialScripting>ScriptMachineのコンポーネントをオブジェクトに追加する。
ScriptMachneを追加するのはドアオブジェクト、スイッチオブジェクトのどちらでもよいが、追加した方=自分のことはThisで指定できるが、自分でない方のオブジェクトは名前を検索してオブジェクトを指示する。

スイッチオブジェクトにScriptMachineを追加し新規Graphを作成し、Graphエディタで開く。


追加するノード5つ
  • On Triger Enter
  • Game Object Compare (Tag)
  • If
  • Game Object Find (name)
  • Animator Play (State)

  • ノード5つを接続しパラメーター記載する。
    これで、ドアスイッチトリガーに接触したら、接触対象のPlayerTagを調べ、Trueの時に、 ドアという名前の付いたオブジェクトを調べ、ドア開アニメーションを再生するフローが完成。
    ドア開のフローをまとめて選択してDuplicateし、On Triger Enter → On Triger Exitにリプレイスして 再生するのをドア閉アニメーションに変更してドア閉のフローを完成させる。

  • On Triger Exit
  • Game Object Compare (Tag)
  • If
  • Game Object Find (name)
  • Animator Play (State)


  • State Machine

    状態を定義しておいて、条件を満たして状態に移行する流れをコントロールする。
    見た目や動きはAnimator Controllerに似ている。

    Startはオブジェクトが登場した時、続く移行条件が満たされれば、次の状態になる。
    Any Stateは、どんな状態からでも、続く移行条件が満たされれば、次の状態になる。
    Script Stateは、その状態になると決めておいた処理を実行する。
    Super は、複数のスクリプトUnitを集めたものと同じく、まとめたもの。


    VR ESPRIT