Unity Visual Scripting 使用随记

1.Wait Until并不会再执行前面的代码,而是反复执行获取bool变量的代码;需自己拆出来写。

2.yield return null对应Wait For Next Frame,多用这个避免协程运行中的GC

3.链接自定义方法在Project Settings->Visual Scripting的Type Options里,每次修改过点击Regenerate Units更新。

4.按住Ctrl+鼠标拖拽,可以放置Group框起来。

5.记得创建外部的SuperUnit(SubGraph)而不是用内嵌的,否则每复制一个都相当于一组新的节点。

6.C#端外部传消息可用CustomEvent.Trigger,接收在事件里找CustomEvent即可。

7.关于状态机Transition的用法,实际上需要绑一个事件一直监听:

也可以加一个CustomEvent,通过事件触发决定跳转

8.ScriptGraph里协程的句柄不好控制,即使用StopAllCoroutine也不行,感觉开的是全局协程执行的。

重点来了——用StateGraph状态机;状态切状态,协程才可以中断。AnyState切状态,是新开的全局协程!

9.StateGraph状态机的AnyState不支持放在SuperState嵌套状态里,必须放在根状态节点,但可以由根节点的AnyState触发然后传入到嵌套状态里。

10.Update、LateUpdate这类事件可以以协程形式执行,但实际上是每一帧开一个新协程。

11.Not boolean节点在VirtualScripting里叫做Negate。

12.用引脚直接前后连接的协程循环会有栈溢出问题,而用While Loop节点组合的协程循环则不会。

13.等待一定秒数之类的异步逻辑可以用Timer节点。

14.自定义Unit中获得宿主GameObject:

public class Foobar : Unit
{
    protected override void Definition()
    {
        ValueOutput<int>("hello", (flow) =>
        {
            var go = (flow.stack.rootObject as MonoBehaviour).gameObject;
            Debug.Log(go, go);
            return 1;
        });
    }
}

15.非继承MonoBehaviour或者UnityEngine.Object的类兼容性不好,体现在运行后声明的变量就没了,需要自己做一些操作。

16.异步Unit节点模板,目前未发现bug:

public class AsyncNodeTest : WaitUnit
{
    protected override void Definition()
    {
        base.Definition();
    }

    protected override IEnumerator Await(Flow flow)
    {
        yield return new WaitForSeconds(1f);
        yield return exit;
    }
}

 

 

 

官方论坛页:https://forum.unity.com/forums/visual-scripting.537/

文档页:https://docs.unity3d.com/bolt/1.4/manual/index.html

posted @ 2021-12-03 11:20  HONT  阅读(2551)  评论(2编辑  收藏  举报