ミドリ黄のプログラミングメモノート

主にUnity(C#)を中心としたプログラムの備忘録

Unity Visual Scripting④(Unitの自作)





参考サイト

Unityの公式ページの方を参考にさせていただきました。
docs.unity3d.com




導入

Visual Scriptingにおいては「Debug.Log」のように既定のUnitが数多く存在します。


しかし、Visual Scriptingを進めていくと自作のUnitを使用したい場面が出てきたのでその方法を紹介します。




概要

まず、自作のUnitを用意するためにはUnitというクラスを継承したC#スクリプトを用意する必要があります。このC#スクリプトを編集していき機能を搭載していきます。

このC#スクリプトには、

  1. 入力や出力などの変数の用意
  2. これらの定義などを行うvoid関数Definitionのオーバーライド

の2つが必要となってきます。

入力や出力に必要な変数の型は次の表を参考にしてください。

型名 概要
ValueInput 変数の入力
ValueControlInput どのUnitの後に呼び出されるか
ValueOutput 変数の入力
ValueControlOutput 次に呼び出されるUnit


また、C#スクリプトを作成したら
「Project Setting」⇒「Visual Scripting」⇒「Regenerate Nodes」
することを忘れないようにしてください。これをしないと、作成したUnitがVisual Scripting上で使用できません。




2つの文字列A, Bを結合する

スクリプト

using Unity.VisualScripting;

public class ConnectStrUnit : Unit
{
    [DoNotSerialize] public ValueInput myValueA;
    [DoNotSerialize] public ValueInput myValueB;
    [DoNotSerialize] public ValueOutput result;

    protected override void Definition()
    {
        myValueA = ValueInput("A", string.Empty);
        myValueB = ValueInput("B", string.Empty);
       result = ValueOutput("result", ResultValue);
    }

    string ResultValue(Flow flow)//文字列を結合する
    {
        var b = flow.GetValue<string>(myValueA);
        var b2 = flow.GetValue<string>(myValueB);
        return $"{b}{b2}";
    }
}



Visual Scripting




実行結果





適当な関数を呼び出す

スクリプト

using Unity.VisualScripting;
using UnityEngine;

public class TestUnit : Unit
{
    [DoNotSerialize] public ControlInput inputTrigger;
    [DoNotSerialize] public ControlOutput outputTrigger;
    [DoNotSerialize] public ValueInput myValueA;

    protected override void Definition()
    {
        inputTrigger = ControlInput("", Test);
        outputTrigger = ControlOutput("");
        myValueA = ValueInput("A", string.Empty);
    }

    ControlOutput Test(Flow flow)
    {
        string a = flow.GetValue<string>(myValueA);
        Debug.Log($"A:{a}");
        return outputTrigger;
    }
}



Visual Scripting




実行結果





yield return コルーチン

スクリプト

using System.Collections;
using Unity.VisualScripting;

[UnitTitle("yield return Coroutine")]
public class YieldReturnUnit : Unit
{
    [DoNotSerialize] public ControlInput inputTrigger;
    [DoNotSerialize] public ControlOutput outputTrigger;
    [DoNotSerialize] public ValueInput valueA;

    protected override void Definition()
    {
        inputTrigger = ControlInputCoroutine("", OnEnterRoutine);
        outputTrigger = ControlOutput("");
        valueA = ValueInput<IEnumerator>("コルーチン");
    }

    private IEnumerator OnEnterRoutine(Flow flow)
    {
        //コルーチンを実行
        var v2 = flow.GetValue<IEnumerator>(valueA);
        yield return v2;;

        //ControlOutputを返すこと
        yield return outputTrigger;
    }
}



Visual Scripting

Coroutineにチェックを入れるのを忘れずに



実行結果