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