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; } }