[Feedback] Our AppleArcade Game

NodeCanvas Forums General Discussion [Feedback] Our AppleArcade Game

Viewing 4 posts - 1 through 4 (of 4 total)
  • Author
    Posts
  • #14937
    Driiade
    Participant

    Hello,

    I’m here to improve NodeCanvas, giving my feedback after 1 year and half working on a successfull AppleArcade game releasing in the end of this month.

    I worked for 3 years now with NodeCanvas, with always sucessfull project because of it (really).
    But I also found some things not working in my flow and for my project, and here are my feedback:

     

    1. SendEvent is great, but not working in many cases. It is frame dependent, and we don’t want to ! If you make a multiple tick of statemachine, you are not within the frame, and this will not work has expected (and we did, to ensure frame stability in our runner game).
    2. Auto reorganization of node is a pain. It is not working, we have to reorganize again and again our FSM/ BT (and this is desastrous for BT). Make some anchor point to modify transition organization, like Amplify shader does.
    3. Blackboard prefab child / dirty blackboard are really a HUGE problem. FSM/BT are not working with not well set blackboard, and dirty blackboard in scene can happen, causing huge problem (easy resolved by hand).
    4. We pooled graph for RAM Usage / CPU saving. But we hacked a lot NodeCanvas for this. I think you have to give us a factory pattern we can override to provide Graph as we want to (pooled, or instantiated, depend of the project / moment in the game).
    5. We hacked Graph.cs to have our own runtime manager (not MonoManager.cs). Ensure Graph script is not Unity dependent, only GraphOwner has to be. Ensure we can easily make our own GraphOwner to update like we want our graph without hacking.
    6. Ensure we can multiple thread subGraph loading. Not needed for our production, but will be cool for dialogue loading (like FF7 Remake does).
    7. Give us Multiple Condition List in FSM. Actually we did a MultipleCondition with bad UI to have this sort of condition : (A AND B) OR (A AND C) in a transition between state.
    8. All entering ActionTask / all Exiting ActionTask, have to execute on the same loop before OnUpdate call. This will prevent and be clearer, that OnUpdate function can access other graph data because OnEnter / OnExit functions executed before. It will leverage some execution order problem.
    9. Decorrelate Editor from RunTime. Too many code is mixed.
    10. Decorrelate Graph.cs from Unity3D. Too many code is mixed with Unity3D when it don’t have too.
    11. We need a Multiple Graph Refactor. Or something to rename variables / scripts easily. And this to maintain big project.
    12. Add OnExit Node for FSM, Executing ActionTask on Exit (we did it, but it’s not NodeCanvas native). Add Parallel Node for BT, so we can add OnExit Node to BT too (as we can’t for now).
    13. And your tool is incredible. I will keep buying it from company to company to make bigger and bigger games ! Keep working on it, you really have a good design pattern !

     

    /////UPDATE 1/////

     

    1. Graph blackboard variables are great for local variables, and exposing them is also really interesting. However for Read(out) variables, they are only updated on exiting Graph. We need other settings like ContinuousWrite(In) and ContinuousRead(Out). Because what I expected in the first time with Read(out) is the ability to read those variables on parent of the subFSM, and have condition to stop the subFSM based on this Read(Out). Which is not possible in current version, because the variable doesn’t change before subFSM is stopped…
    #14950
    Gavalakis
    Keymaster

    Hello again,

    Thank you for your positive feedback as well as all your suggestions! šŸ™‚

    1. Would making it cache and consume a flag instead of using YieldReturn (as we’ve previously discussed) would work for you? I was thinking of doing this as an option for all conditions that utilize YieldReturn.
    2. Adding anchor points on connections is something already in the TODO list šŸ™‚
    3. Can you please share a bit more information regarding this issue here?
    4. In v3 there is the option to load graphs Async on a separate thread. This can work as an alternative solution to pooling, but of course not always possible or the same. Have you used the Async option (found on GraphOwner inspectors) as of yet?
    5. Also in v3 :), there is the option to update graphs (GraphOwners) manually. With this option (GraphOwner inspector -> Update Mode -> Manual), the MonoManager is not used or required. Have you seen or used this option?
    6. Yep, Async load of SubGraphs (instead of only root graphs) is in the roadmap.
    7. This has been requested more than once in the past so maybe it is something people need after all.
    8. Action OnExecute is indeed called before OnUpdate and on the same frame. Can you please clarify what is the issue you faced with this? šŸ™‚
    9. I agree.
    10. But why is that a problem considering that NC is a Unity asset and I don’t foresee the ability to use it outside of Unity.
    11. Yes, more refactoring options (both as the new editor refactoring tool as well as with attributes is on the way (hopefully for the next version too).
    12. Do you mean an FSM node that calls a list of actions when the FSM stops (or exits)? Regarding Parallel node in BT, do you mean a Parallel Sub-Graph BT node? In BTs there is also the Parallel Composite node, which can potentially be used to run children in parallel (be them anything, even Sub-BTs, or Sub-FSMs).
    13. Thank you once again for your feedback and suggestions above!

    Join us on Discord: https://discord.gg/97q2Rjh

    #14951
    Driiade
    Participant

    Hey !

    1. it will not work as explicated in my other thread. There are situations where the callback is not yet added, and you will miss the message. I strongly suggest a pool of incoming message, and check in this pool if the message was sent between 2 graph update. Care you can’t throw the pool after Graph update, because intern message will be directly throw and so not available for next update.
    You need 2 buffer, 1 buffer for last sent messages, 1 for current available messages, each time you send a message, you add them to the last sent message. Before updating a graph, you need to swap buffer from last sent message to current available messages. It’s a bit a mess, but it ‘sĀ  what we found to be order independant.

    And if you want all graph to be order independant, you need to do the swap right before ALL graph update (so MonoManager can do that.. I suppose ^^).

    3. Dirty blackboard in scene don’t have newly added variables. Causing a lot of problem. Same things if you delete variables, reorganize or whatever. There are all strange and non intuitive behaviour (some times, all variable values are shift from variables). What I personaly expect: each blackboard variables have an ID (like a script have), reorganizing the blackboard doesn’t dirty those variables, adding a value doesn’t dirty other variables, deleting is the same… What we had to do to support level designer to override/modify value, is to have a script which can override a blackboard value on Awake. Dirtying the script doesn’t matter for Unity.

    4. Yes I used it with the pooling system (best of 2 worlds). And hacked NestedFSM to get from pool. But to be sure NestedFSM / SubBT are working with pooling, I hacked all of them to retrieve Graph from the pool.

    5. Yes there is that option. And in fact we would have to create our own FSMOwner. But Graph still had reference to runtime, when it really don’t have to (I cut all dependency between Graph and Runtime).

    8. Yes this is a touchy point. To secure execution order, what I believe is the best is to have this sort of architecture :

    -All entering Action during this update are executed
    -All updating Action during this update are executed

    – All exiting Action during this update are executed

    A bit like Unity does with Awake/Start/Update during a frame.

    Instead of :
    -For every graph update -> execute OnEnter/OnUpdate/OnExit

    Maybe this point is difficult to have because BT are not the same as FSM and so we can’t do this.

    10. Some of us want to have this on a server without Unity. But yes throw this point, it’s not really a blocking point.

    12. Yes for the first point. For BT, we can have parallel sub graph And parallel ActionTask, like FSM. In fact, all graph have to be defined with some parallel Node, and parallel Graph running with them. It’s a good principle when working with this sub graph pattern.

    I added other points in the first message(^^)

     

    #15003
    Driiade
    Participant

    Hello,

    • Also found you can factorize a lot of things.
      Like the OnReset of BTNodeNested<T>Ā  / On Exit of the FSMStateNested (see attachments)
    • IGraphAssignable has a special edge case on Graph.cs line 599. But you can delete this and TryStopSubgraph on node.OnGraphStopped
    Attachments:
    You must be logged in to view attached files.
Viewing 4 posts - 1 through 4 (of 4 total)
  • You must be logged in to reply to this topic.