💤
VisualScriptingとUniTaskを組み合わせる
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