💤

VisualScriptingとUniTaskを組み合わせる

2022/08/18に公開

VisualScriptingのカスタムユニットは、UniTaskと組み合わせて使うことができます。
ここでは、UniTask.Delay()によって出力を遅延させるシンプルなサンプルをご紹介します。

カスタムユニット

using Cysharp.Threading.Tasks;
using Unity.VisualScripting;

namespace VisualScriptingTest
{
    [UnitTitle("Delay")]
    public class DelayUnit : Unit
    {
        [DoNotSerialize] private ControlInput _input;

        [DoNotSerialize] private ControlOutput _output;
        
        [DoNotSerialize] private ValueInput _valueInput;
        
        [DoNotSerialize] private GraphReference _graphReference;
        
        protected override void Definition()
        {
            _input = ControlInput("Input", Enter);
            _output = ControlOutput("Output");
            _valueInput = ValueInput<int>("Delay", default);
            Succession(_input, _output);
        }

        private ControlOutput Enter(Flow flow)
        {
            _graphReference = flow.stack.ToReference();
            var delay = flow.GetValue<int>(_valueInput);
            DelayAsync(delay).Forget();
            return null;
        }
        
        private async UniTaskVoid DelayAsync(int delay)
        {
            await UniTask.Delay(delay);
            var flow = Flow.New(_graphReference);
            flow.Run(_output);
        }
    }
}

Enterメソッド内でFlowの状態を保存し、UniTask.Delay()の実行後にFlowを復元して出力します。

スクリプトを作成したら、設定画面からRegenerate Nodeを実行すると、ScriptGraphで検索できるようになります。

使い方

以下のようなScriptGraphを作成し、ScriptMachineにアタッチします。

Delayパラメータに遅延させたいミリ秒を指定して再生すると、Debug.Log()が遅れて出力されます。

検証時の環境

  • Unity: 2021.3.8f1
  • Platform: Windows10
  • VisualScripting: 1.7.8
  • UniRx: 2.2.5

Discussion