Search Unity

FlowCanvas - Visual Scripting Similar to Unreal Blueprints

Discussion in 'Assets and Asset Store' started by nuverian, Apr 14, 2015.

  1. Der_Kevin

    Der_Kevin

    Joined:
    Jan 2, 2013
    Posts:
    517
    i just reply since iam already here :D

    1)maybe i missunderstand the first question but as far as i can tell nodes have multiple in - input. . depends on the node. and you can also use a splitter. but what do you wanna do for example?

    2)yes, you can export them as json or save them as .asset file to reuse them in unity
     
    nuverian likes this.
  2. Smokas

    Smokas

    Joined:
    Mar 7, 2016
    Posts:
    114
    1. Example: mouse.x and gamepad.x connected to the same input port.
     
  3. nuverian

    nuverian

    Joined:
    Oct 3, 2011
    Posts:
    2,087
    Hello,
    Thanks for your interest in FlowCanvas.

    1. Connecting multiple value outputs to a single value input does not really work since naturally only one of the two values should end up being used. In your example, if we were to connect both mouse.x and gamepad.x to some input, then which one of them will end up actually being used by the node? :)
    On the other hand, connecting multiple flow outputs to a single flow input is possible, so that a node can be called from multiple other nodes.

    2. Just like others mentioned, yes. Graphs can be exported to to json as well as .asset files if you so require.

    Let me know if you have any further questions.
    Thanks.
     
  4. Smokas

    Smokas

    Joined:
    Mar 7, 2016
    Posts:
    114
    Thanks for answer. Bought it. I own PlayMaker and Behaviour Designer but missed something more closely related to Unity programming paradigm. I liked keeping global variables in Blackboard approach :).
     
    Last edited: Jun 24, 2016
  5. everything3d

    everything3d

    Joined:
    Aug 4, 2015
    Posts:
    3
    what are the main differences between nodeCancas and FlowCanvas ?

    what i really miss on the paradoxnotion site is a comparision overview
    between FlowCanvas and NodeCanvas
     
    Last edited: Jun 24, 2016
  6. Almakos

    Almakos

    Joined:
    Dec 13, 2013
    Posts:
    179
    Hey @nuverian sadly I've just missed sale by like 20 minutes. any chance to still get this asset by discounted price?
    I really wanted to try but just got back home from work. thank you
     
    GamerPET likes this.
  7. GamerPET

    GamerPET

    Joined:
    Dec 25, 2013
    Posts:
    370
    FlowCanvas is more like... actually programming with nodes.
    NodeCanvas is ... behavior trees.

    With FlowCanvas you start something with an event... you have switches, if/else ... variables... you can modify variables, etc.
     
    nuverian likes this.
  8. Deadlyapples

    Deadlyapples

    Joined:
    Dec 30, 2013
    Posts:
    54
    Same here mate. I was at work and got a sneak peak at that and went to try and buy it but work blocks many websites so I came home at lunch break to find it has passed! :'C
     
    Almakos likes this.
  9. sonicviz

    sonicviz

    Joined:
    May 19, 2009
    Posts:
    1,051
    Hi,
    I've had NodeCanvas for a few years but never really used it much.

    I just picked up FlowCanvas in the sale as I thought I'd take another stab at the visual programming "thing" for some simple game concepts I'm playing with.
    (I've had playmaker for years but never quite got into it, guess I'm too old skool coding style)

    I'm testing the SpaceInvaders_AndyGFX package.
    It works ok first time you run it, but when you click on goPlayerShip and Edit Flow Script, it throws a whole bunch of errors next time you play. That's without touching anything in the edit window, just opening it.

    See attached image.

    Seems to be a tag issue on the enemy GO's but nothing in the script to indicate what it should be.
    Still getting my head around FC & NC.

    EDIT: Fixed it. Needed to add a tag "Bullet" and apply that to goBullet. Works now.
    Strange how it worked on import but the tag seemed to be deleted when I opened the Edit Flow Script. There was definitely no Bullet tag when I looked so had to physically add it in.
     

    Attached Files:

    Last edited: Jun 24, 2016
  10. Der_Kevin

    Der_Kevin

    Joined:
    Jan 2, 2013
    Posts:
    517
    soo. i hope you all bought flowcanvas yesterday ;)

    so, i have a problem... my flowscript looks like this:
    flowcanvas_dragntint.jpg

    what it does is this:
    https://gfycat.com/ComplicatedQueasyGuineafowl

    it activates a drag and rotate script (the first right node - set enabled (BouncerUP)
    it sets its rigidbody to kinematic
    and (what doesent work) it sets its material to a transparent green.
    as you can see in the gfycat link, the box turns green while draging/button down on the bouncer) but not back to normal (last node) when i release the mouse button. what have i done wrong?
     
  11. Smokas

    Smokas

    Joined:
    Mar 7, 2016
    Posts:
    114
    Wanted to create simple flow which gets gameobject children positions and moves object along them.
    How it looks with "out of box" FlowCanvas functionality:
    Screen Shot 2016-06-25 at 00.12.06.png

    Created simple node:
    Code (CSharp):
    1. namespace FlowCanvas.Nodes
    2. {
    3.     [Category("Functions/Reflected/Transform/Methods")]
    4.     [Name("Get Children")]
    5.     public class GetChildren : PureFunctionNode<List<Vector3>, GameObject>
    6.     {
    7.         public override List<Vector3> Invoke(GameObject inp)
    8.         {
    9.             List<Vector3> list = new List<Vector3> ();
    10.             if (null != inp)
    11.             {
    12.                 foreach (Transform t in inp.transform)
    13.                 {
    14.                     list.Add (t.position);
    15.                 }
    16.             }
    17.             return list;
    18.         }
    19.     }
    20. }
    And how it looks now:
    Screen Shot 2016-06-25 at 00.12.31.png
     
    nuverian likes this.
  12. nuverian

    nuverian

    Joined:
    Oct 3, 2011
    Posts:
    2,087
    Thanks a lot for getting FlowCanvas! I'm very glad you like it :)

    Hey,
    Nice idea, I will add a comparison/differences on the website soon. Thanks.
    Meanwhile, this post here is actually very good at explaining the differences instead of me repeating those :)
    Let me know if that helps or you need more clarification.

    Really sorry to hear that guys :/
    Unfortunately the Unity asset store does not give us publishers any way of one-off discount coupons or similar, so it is practically impossible for me -even though I'd gladly do so-, to provide a per-person discount in any way through the asset store. I really wish the asset store had that possibility, but sadly it does not.
    Hopefully FlowCanvas will get on a new sale once again soon.
    Thank you!

    Hey,
    Thanks for getting FC! Indeed the demo game needs for the "Bullet" tag to be added for it to work correctly as stated in the description as well :) I'm glad you sorted this out. I suppose that on first import Unity has the tag somehow cached, but has certainly nothing to do with FC.
    Cheers!

    Hey,
    I've just made a small example and it works fine here as far as materials go.
    SetMaterial.png

    As far as I see though, on Mouse Up only the first node (set enable to false) is called and the flowscript ends there. So I assume that you somehow disable the FlowScriptController this flowscript in the image is attached on (or it's gameobject as a whole) when the Set Enabled to false node is called on mouse up. Is this flowscript on the BouncerUP gameobject and what behaviour have you assigned to set true/false on the top right node?

    Also, when this happens (MouseUP) is the FlowScriptController still active?
    ActiveScript.png

    Let me know.

    Hey,
    Thanks for sharing :)
    Creating custom nodes tailored to the game/application is indeed something that should be done in most cases. Minimizes the nodes required and makes things far more reusable. Alternatively , you could also create a Macro of course, but since you can code, creating custom nodes like this is possibly better :)
     
  13. Der_Kevin

    Der_Kevin

    Joined:
    Jan 2, 2013
    Posts:
    517
    hey, thanks for taking the time to see threw this.
    so, indeed, the flow script controller turns off when i lift the mouse button up. the set enabled flip will turns back to false when i do mouse up, but the set is kinematic flop stays true(was false on startup)
    the script that gets enabled is this:

    Code (CSharp):
    1. using UnityEngine;
    2. using System.Collections;
    3.  
    4. public class RotateBuilding : MonoBehaviour
    5. {
    6.  
    7.     public float rotationAmount;
    8.     public float rotationSpeed;
    9.     public Vector3 destEuler = new Vector3(0, 0, 0);
    10.     private Vector3 currEuler = new Vector3(0, 0, 0);
    11.  
    12.     // Use this for initialization
    13.     void Start()
    14.     {
    15.  
    16.         rotationAmount = 90.0f;
    17.         rotationSpeed = 99.0f;
    18.         transform.eulerAngles = destEuler;
    19.     }
    20.  
    21.  
    22.     // Update is called once per frame
    23.     void Update()
    24.     {
    25.  
    26.         if (Input.GetKeyDown(KeyCode.RightControl))
    27.         {
    28.             destEuler.y += rotationAmount;
    29.         }
    30.         else if(Input.GetKeyDown(KeyCode.LeftArrow))
    31.         {
    32.             destEuler.y -= rotationAmount;
    33.         }
    34.         currEuler = Vector3.Lerp(currEuler, destEuler, Time.deltaTime * rotationSpeed);
    35.         transform.eulerAngles = currEuler;
    36.  
    37.  
    38.     }
    39. }
    which actually just enable me to rotate the bouncer as long as i have the mouse mouse button down.

    what i can see so far is, that the mouse up command stuck in the first (not 0) field of the splitter
     
  14. Deadlyapples

    Deadlyapples

    Joined:
    Dec 30, 2013
    Posts:
    54
    Any ideas on sale timeframes and how long they last. :p
     
  15. amoka

    amoka

    Joined:
    Dec 18, 2015
    Posts:
    58
    Daily Deals last for 24 hours. They start and end at GMT 13:00 to my best knowledge.
     
    Last edited: Jun 27, 2016
    nuverian likes this.
  16. lildub

    lildub

    Joined:
    May 6, 2015
    Posts:
    14
    Hey, does this work with hololens build anyone know?
     
  17. nuverian

    nuverian

    Joined:
    Oct 3, 2011
    Posts:
    2,087
    Just for your information, if you want you can set the option "OnDisable" on the FlowScriptController inspector to "Do Nothing". Doing this will not disable the graph when the gameobject is disabled. Maybe that will come in handy in your case :)

    Hello,
    Can you please provide more information as of what you are after?
    Thanks!
     
  18. Der_Kevin

    Der_Kevin

    Joined:
    Jan 2, 2013
    Posts:
    517
    exactly that solved it :D thanks!
     
    nuverian likes this.
  19. Smokas

    Smokas

    Joined:
    Mar 7, 2016
    Posts:
    114
    Hi,

    I tried to implement event for OnApplicationQuit and OnApplicationPause - without success :(
    Can you give some guidelines how to do it?
     
  20. nuverian

    nuverian

    Joined:
    Oct 3, 2011
    Posts:
    2,087
    Hey,

    I have attached for you here the Application event nodes. Those will also be included in the next version since I think I should have done so in the first place :). To make these nodes work, you should also need to open up MonoManager.cs script and please add the following lines of code somewhere within the class:
    Code (CSharp):
    1.         public event Action onApplicationQuit;
    2.         public event Action<bool> onApplicationPause;
    3.  
    4.         void OnApplicationQuit(){
    5.             isQuiting = true;
    6.             if (onApplicationQuit != null){
    7.                 onApplicationQuit();
    8.             }
    9.         }
    10.  
    11.         void OnApplicationPause(bool isPause){
    12.             if (onApplicationPause != null){
    13.                 onApplicationPause(isPause);
    14.             }
    15.         }
    (Please note that there already exists an OnApplicationQuit method there. Just append the code of that method above within the existing one).

    ApplicationEvents.png

    Cheers!
     

    Attached Files:

    IFL, GamerPET and Smokas like this.
  21. Smokas

    Smokas

    Joined:
    Mar 7, 2016
    Posts:
    114
    Thank you - for the fix and for the hint how to do it :)
     
    nuverian likes this.
  22. GamerPET

    GamerPET

    Joined:
    Dec 25, 2013
    Posts:
    370
    I havn't worked on my project since February... but today I decided to open it so I can update my plugins. I updated FlowCanvas and now I have a lot of errors like this:

    Assets/FlowCanvas/Module/Nodes/Simplex/Functions/Utility.cs(99,22): error CS0101: The namespace `FlowCanvas.Nodes' already contains a definition for `LogValue'

     
  23. nuverian

    nuverian

    Joined:
    Oct 3, 2011
    Posts:
    2,087
    Hey,

    Welcome back :)
    This most probably happened because there was a folder restructure from the February version.
    Please remove the previous FlowCanvas installation folder and re-import the package a-new.

    Let me know if that works for you.
    Thanks.
     
  24. GamerPET

    GamerPET

    Joined:
    Dec 25, 2013
    Posts:
    370
    Yea it worked. Thanks
     
  25. GamerPET

    GamerPET

    Joined:
    Dec 25, 2013
    Posts:
    370
    I like the new "Space" menu... the one where you add new nodes to the scene.



    This one. However I have a suggestion.

    Since I'm a newbie... I don't know exactly what I need & what I want so I have the tendency to check ALL the menus. Right now it's a bit slower to check all the menus because every time you click on something ... and you want to go back you have to press a button (The top item becomes a back button).


    So every time I click a category, I have to click back. I want a shortcut button to do that.

    1. the Backspace on the keyboard
    2. Right Click on the mouse

    Would this be possilbe? This way I can click, then if the stuff I want it's not there I can right click and I get back to the menu.

    Thanks <3
     
  26. nuverian

    nuverian

    Joined:
    Oct 3, 2011
    Posts:
    2,087
    Sure. I will add these shortcuts to go back in the menu, in the next version :)
     
    GamerPET likes this.
  27. Der_Kevin

    Der_Kevin

    Joined:
    Jan 2, 2013
    Posts:
    517
    heyhey.
    the on trigger enter node in combination with a switch tag node (so when a gameobject with a specific tag enters the trigger) seams not to work on a ios build? any idea what could cause this? i also dont have any error or something else
     
  28. nuverian

    nuverian

    Joined:
    Oct 3, 2011
    Posts:
    2,087
    Hey,
    I can't think of a reason that the Switch Tag node specifically would not work. Does everything else work for you except this one?

    Please let me know
    Thanks.
     
  29. IFL

    IFL

    Joined:
    Apr 13, 2013
    Posts:
    408
    @nuverian - Is zoom supposed to disable the searchable menu? I get the context-menu if I'm zoomed out just a little.

    Also, FlowCanvas is awesome for VR scripting. (It has a few issues with the SteamVR plugin, but they're easily fixed and only related to the fields/accessors issue of which you're already aware) Thanks for making such a versatile and useful tool!
     
  30. nuverian

    nuverian

    Joined:
    Oct 3, 2011
    Posts:
    2,087
    Hello,
    Thanks! I am glad you like FlowCanvas :)
    Yes, when zoomed out, the normal context menu is popped up on purpose. You can though always bring up the searchable browser by hitting the 'Space' keyboard key. :)
     
    IFL likes this.
  31. kinodax

    kinodax

    Joined:
    Dec 3, 2014
    Posts:
    22
    Is there any special way to load the JSON + dependencies at runtime? For instance I have a nice FlowGraph with audio clips. I can generate the JSON file, but how would I set things up so I could make a self contained bundle. I would like to use FlowCanvas to specify an expanding set reaction modules for a set of NPC's.

    As a related side question, is there a declarative way to specify a flow graph? I was up for writing JSON modules and "get" the graph structure, except for encoding the information for the object references.

    Code (JavaScript):
    1.         {
    2.             "value": {
    3.                 "_value": 21
    4.             },
    5.             "_inputPortValues": {
    6.  
    7.             },
    8.             "_position": {
    9.                 "x": 6313.196,
    10.                 "y": 5561.944
    11.             },
    12.             "$type": "FlowCanvas.Nodes.GetVariable`1[[UnityEngine.AudioClip, UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]",
    13.             "$id": "253"
    14.         }
    Am I right in guessing that "_value:21" somehow references the actual audio clip ? Maybe another question might be is there another serializer format/process/asset that is compatible but also easily writable by other processes (human readable/modifiable) and complete? I am thinking of making a compatible NPC auto reaction generation tool, but it needs to be able to specify all the parameters. Or maybe I should look into sending messages to other objects or post to the blackboard to specify the desired clip. The only down side to that loosing some of the the nice drag a clip and just write it up interaction that FlowCanvas supports. I guess the main question is: what is the best way to interface FlowCanvas to other external modules that also could do node-flow-graph processing/generation/analysis.
     
  32. Der_Kevin

    Der_Kevin

    Joined:
    Jan 2, 2013
    Posts:
    517
    Heyhry!
    Iam trying to raise a float slowly over time with flow canvas. So that a float start at 0 and after 1 seconds its at 10 and so on
    But how could i do this with fc?
     
  33. IFL

    IFL

    Joined:
    Apr 13, 2013
    Posts:
    408
  34. Der_Kevin

    Der_Kevin

    Joined:
    Jan 2, 2013
    Posts:
    517
    Thank you very much :)
     
  35. nuverian

    nuverian

    Joined:
    Oct 3, 2011
    Posts:
    2,087
    Hello,

    Unity.Object references are serialized by an integer that represents the index in a list of object references stored internally in the flowscript and this is practically the only good way of serializing Unity.Object references. There is really no other safe/consistent way of storing a unity object reference I know of. So, indeed that number "21" is the index of the reference in that internal list.

    The Graph.Deserialize method though has a List<UnityEngine.Object> parameter, which you can use to provide the list of objects that those references will be deserialized from. As long as the json serialized or modified indices are correct in relation to the provided list, the graph will deserialized correctly. Having said that though, I don't really thing that this is a convenient thing to do in practice. If you have any other way of safely serializing a Unity object reference in json format I will of course be glad to hear it :)
    Is there a specific reason you want to use and manually load graphs from JSON in runtime, that using blackboard variables do not cover?

    Let me know.
    Cheers!

    Thanks for helping and sharing! :)
     
    IFL likes this.
  36. IFL

    IFL

    Joined:
    Apr 13, 2013
    Posts:
    408
    How should I go about writing the code for a delegate and accompanying event? Use case is to register a delegate via a reflected method (easy), and then use that delegate as an event (mystery to me). Currently thinking that the custom delegate could simply call an event method, but I'm not sure how I'd do that with each separate delegate. I'm not asking for a code example (unless you really want to), but a push in the right direction would greatly help. Thanks in advance!

    [EDIT::] I might be an idiot. It's in the docs. I'm still having issues with it, but I'll figure it out.
     
    Last edited: Jul 26, 2016
  37. illinar

    illinar

    Joined:
    Apr 6, 2011
    Posts:
    863
    Hello. I'm considering buying this tool. I checked your website and I love what I see. When I saw the animation of the workflow there I almost teared up, I've been dreaming about having Blueprint in Unity :)

    I would suggest to make a FAQ section on the website for questions like the one I am about to ask. How good is performance of those scripts compared to normal scripts? Also would love to know how it works under the hood.

    Also I would like to see how this tool is integrated with game objects and component system in the editor. For example in unreal you could have Level Blueprint that wasn't part of your assets as I recall it just was in the level, so are FlowCanvas scripts saved as assets?

    There could be a YouTube video with demonstration I'm surprised there are no videos about FlowCanvas.

    Also an important selling point is that you do listen to feedback and keep improving the tool, as far as I can tell. That's great.

    And, sorry, last question, but it is probably a big one.. What are the differences between FlowCanvas and Blueprint? I assume it has less features, and it is behind Blueprints in that way, but maybe it does some things better than blueprint?
     
    Last edited: Jul 26, 2016
    IFL likes this.
  38. IFL

    IFL

    Joined:
    Apr 13, 2013
    Posts:
    408
    @illinar - If it looks good to you, you should get it. It's wonderful for me. It beats every other visual scripting tool that I've used. It's also really handy with NodeCanvas, but I mainly use FC alone.

    I agree about the FAQ and videos. It felt like a leap of faith when I first bought it.

    In my experience, it's maybe a tiny bit slower than hand-scripting, but the cost is negligible. Just don't have the FC window open if you're trying to profile anything. And make sure to avoid allocations in custom nodes.

    You can either have the FC graphs bound to a scene GameObject or saved as an asset. When saved, multiple scene objects can utilize the single FC asset.
     
    nuverian likes this.
  39. Rixtter

    Rixtter

    Joined:
    Mar 31, 2014
    Posts:
    244
    I would say that you can get a lot more done with FC in a much quicker time.

    FC is designed to save you time by giving you shortcuts against Unity's API by packaging complexity into fewer nodes. To give you an example, take a look at one of the entries I posted on FC forums:

    http://flowcanvas.paradoxnotion.com/topic/graph-snippets-vector3-from-gameobject/

    Blueprint is undoubtable brilliant, especially now that they are implementing C++ conversion. I tried working with it because I like to tinker with Visual tools, but I couldn't make the switch after learning Unity's API. Had I gone the other way I could be saying the opposite... dunno.

    IF Blueprint can do more than FC then I'd be very surprised. But if there's anything you can't do in FC you can add your own nodes which is a breeze - really!! Get stuck, we'll help out & you probably won't need to ask twice. Check out the Enum post also over on the Examples forum in FC. Does it get much easier than that?

    http://flowcanvas.paradoxnotion.com/topic/code-snippets-enum/

    You also won't find anything unanswered from Google for C# solutions to common problems.

    That said, I am from the camp that if you learn the basics of C# you can do anything in Unity. I rate myself as expert in the basics... I don't need to know advanced topics such as Delegates or Lambdas etc, or even delve much into OOP. As an indie developer, I argue my game will not suffer if I don't use the most efficient coding paradigms. Why would it? I'm not writing games like AAA studios.

    To show I'm not an FC fanboy as such lol... have you seen Nottorus on the asset store? Check it out. It's like Blueprint on steroids. It is LITERALLY visual programming. Each node directly translates to perfectly translated C#... and you can convert C# into nodes too... perfect way to learn!! Ultimately you end up with a project that is pure C#. Think of the concept of buying Unity assets and converting into Nottorus nodes to help you expand upon them. The downside is the price of $250 and lack of support & community. Big potential, poor adoption.

    In conclusion & to end my blah... FC is a shortcut to getting the job done. The dev here will answer EVERY question with either the nodes or the code you need. Every time. I bought Playmaker because I wanted a state machine, asked 2 simple questions a couple of weeks ago... nothing. That won't happen here.

    Rix
     
    nuverian likes this.
  40. Rixtter

    Rixtter

    Joined:
    Mar 31, 2014
    Posts:
    244
    Nuv, the above made me think about a topic that could help some folk... state machines. I have been researching different implementations in C# and was wondering the equivalent in NodeCanvas. If I post some code is it something worth looking at? If so, over on FC or NC forums?
     
  41. illinar

    illinar

    Joined:
    Apr 6, 2011
    Posts:
    863
    @IFL, @Rixly239, thank you for replies. I'm sold, FC does look perfect, except I'm a bit concerned about performance (still would love to get some numbers). Kinda strange that FC doesn't generate C# code.. Especially since IL2CPP is coming (and is already available on some platforms), and we could have in ideal case a visual script running with a speed of C++. I need to know what performance really is here in FC. So could someone please run some benchmark in FC vs C# for different types of operations? :) Aren't you curious? The better performance is, the wider range of tasks I'll be able to delegate to it, to make my life easier.

    I really hate Nottorus' UI (not to mention 250$ price tag), and FC has done it right, it seems, although I would suggest a tiny improvement. And clean UI is important for an effortless workflow.

    And I wonder if it would be possible to have "Construction Blueprints" in FC (graphs that control objects in the editor), that would be AMAZING! Because Unity's editor API is so bad, such a pain to work with, buggy and poorly documented. And with editor visual scripting it can be so easy to create custom tools.

    EDIT: And here is the UI tweak I was talking about. Before/After. tweak.png
    Those bars on the sides really serve no purpose. They do not improve visual clarity unlike everything else. They look good on unconnected nodes, but in the graph, they are unnecessary distraction.
     
    Last edited: Jul 27, 2016
  42. Rixtter

    Rixtter

    Joined:
    Mar 31, 2014
    Posts:
    244
    nuverian likes this.
  43. illinar

    illinar

    Joined:
    Apr 6, 2011
    Posts:
    863
    @Rixly239

    Awesome, thanks. So it is the fastest of all the best tools (Nottorus unspecified) in that particular test case and probably overall, and with 0 garbage allocation. This stuff should really be on the tin! (In the asset store description and on the website front page if not FAQ) That all I needed to now. I think memory won't be an issue for me.. Only editor performance might be a bit of a problem if I will try to test in VR in the editor, where lacking FPS = nausea. But I think I can work around that.
     
  44. nuverian

    nuverian

    Joined:
    Oct 3, 2011
    Posts:
    2,087
    Hey,

    There already exists a node "Code Event" that can subscribe itself to an Action or Action<T> event of a MonoBehaviour, and that will start a flow signal when the event is raised. Is this what you are looking after, or a more in depth way to manage delegates within the flowscripts? Or, maybe something entirely different that I did not understand? :)
    Let me know. Thanks!

    Hey,

    Thanks a lot for your interest in FlowCanvas. I am very glad you like it!

    A FAQ sounds indeed like a good idea and one I will look after creating soon, yes. Regarding videos, because I am Greek and my spoken English are not that good, I recently contacted a professional video tutorial author for creating videos for FlowCanvas (as well as the rest of the tools of course). More on that coming soon though!

    I think @Rixly239 and @IFL covered most of your questions quite well. Thanks a lot for that guys and for your feedback as well! :)

    Regarding your other questions/suggestions, FlowCanvas does not support creating Unity Editor scripts and unfortunately it's not something that can be supported in the future as well, mostly because FC does not generate actual code, and editor scripts can only work with actual code. Avoiding code generation was a design choice that has several advantages as well as some disadvantages like the above, but of course as you can see performance is not one of them.

    Regarding your UI suggestion, I honestly prefer the image on the left with the vertical bars on the side of the nodes :). Of course if I am the only one doing so and more people suggest that the image on the right without the bars looks better, then I can definitely reconsider removing them. I just think that those bars provide a good visual link of the ports and to the nodes they belong to, rather than the ports looking a bit of visual disconnected from the node they belong.

    If there is any other question/suggestions you have (or some question I missed in your posts and not covered already) by all means do let me know of course.

    Thanks again :)

    Hey,

    That's great. If it is about State Machines, then it is definitively relevant to NodeCanvas since NodeCanvas includes a whole FSM system within ;) By all means, please feel free to post anything you think will be helpful to others regarding FSMs, in the NodeCanvas forums! Thanks!
     
    IFL likes this.
  45. gomez_addams

    gomez_addams

    Joined:
    Jul 30, 2016
    Posts:
    7
    I'm just getting into FlowCanvas, but already I hit an error in my development with HoloLens. That requires a Windows store build (so UNITY_WSA_10_0) and I get build errors in three places:

    FlowCanvas/Framework/_Commons/Runtime/Other/ReflectionTools.cs
    FlowCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/Internal/fsPortableReflection.cs
    FlowCanvas/Framework/_Commons/Runtime/Serialization/Full Serializer/Reflection/fsTypeCache.cs

    These errors involve TypeInfo where Type is expected. Substituting changes to fetch the Type value from the TypeInfo works to fix the build, but with these fixes (or even with the code turned into a no-op) I get an error once I try to run the build on the device. Here's the error (trimmed down a bit):

    derived method 'get_objectvalue' in type 'taskagent' from assembly cannot reduce access

    You can probably see the same thing using the free HoloLens emulator to test.
    I won't be able to make use of FlowCanvas unless it's able to work on this target. Any ideas for a workaround?
    Thanks!
     
  46. nuverian

    nuverian

    Joined:
    Oct 3, 2011
    Posts:
    2,087
    Hello,
    I haven't yet tested FC support for HoloLens, but Unity HoloLens support itself is still under technical preview release and based on the Unity 5.4 beta, so there can certainly be some problems that are not FC related. I will take a look at that tomorrow though. Do you use the latest FlowCanvas version from the asset store by the way?
    Thanks.
     
  47. Alexarah

    Alexarah

    Joined:
    May 1, 2014
    Posts:
    110
    Hi there Nuverian is it possible to make custom editors and editor windows with Flow Canvas? I already know that Nottorus can do it but that product is too pricey for me but I already have Flow Canvas though. I see Flow Canvas is similar to Unreal Engine Blueprint although I think Flow Canvas is easier to use even without reading any documentation.:) Anyway let me know if it's possible and if so what would be a good way of approaching it.
     
  48. nuverian

    nuverian

    Joined:
    Oct 3, 2011
    Posts:
    2,087
    Hey!
    I am glad you like FlowCanvas, unfortunately though, FC does not support creating Unity Editors. This is because FC does not generate actual scripts which is a requirement to create Unity Editors of any kind. Sorry :)
     
  49. gomez_addams

    gomez_addams

    Joined:
    Jul 30, 2016
    Posts:
    7
    Yes, I'm using version 2.5.6c of NodeCanvas and 1.2.5b of FlowCanvas. I was able to patch the framework and make it happier so it would actually build for the WSA target, but then at runtime I'm inundated with errors.

    build configuration
    scene configurations during testing
    {hololens} suffix usage

    + $exception {"Cannot create an instance of an interface or abstract type for NodeCanvas.Framework.Node"} System.Exception

    > Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsMetaType.CreateInstance() Line 299 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.Internal.fsReflectedConverter.CreateInstance(ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType) Line 102 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_3_Inheritance(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result, out System.Collections.Generic.List<ParadoxNotion.Serialization.FullSerializer.fsObjectProcessor> processors) Line 818 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_1_CycleReference(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result, out System.Collections.Generic.List<ParadoxNotion.Serialization.FullSerializer.fsObjectProcessor> processors) Line 723 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.TryDeserialize(ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, System.Type overrideConverterType, ref object result) Line 685 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.TryDeserialize(ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result) Line 659 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.Internal.fsIEnumerableConverter.TryDeserialize(ParadoxNotion.Serialization.FullSerializer.fsData data, ref object instance_, System.Type storageType) Line 72 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_5_Converter(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type resultType, ref object result) Line 860 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_4_Cycles(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type resultType, ref object result) Line 852 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_3_Inheritance(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result, out System.Collections.Generic.List<ParadoxNotion.Serialization.FullSerializer.fsObjectProcessor> processors) Line 831 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_1_CycleReference(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result, out System.Collections.Generic.List<ParadoxNotion.Serialization.FullSerializer.fsObjectProcessor> processors) Line 723 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.TryDeserialize(ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, System.Type overrideConverterType, ref object result) Line 685 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.Internal.fsReflectedConverter.TryDeserialize(ParadoxNotion.Serialization.FullSerializer.fsData data, ref object instance, System.Type storageType) Line 88 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_5_Converter(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type resultType, ref object result) Line 860 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_4_Cycles(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type resultType, ref object result) Line 852 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_3_Inheritance(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result, out System.Collections.Generic.List<ParadoxNotion.Serialization.FullSerializer.fsObjectProcessor> processors) Line 831 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_1_CycleReference(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result, out System.Collections.Generic.List<ParadoxNotion.Serialization.FullSerializer.fsObjectProcessor> processors) Line 723 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.TryDeserialize(ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, System.Type overrideConverterType, ref object result) Line 685 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.TryDeserialize(ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result) Line 659 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.JSONSerializer.Deserialize(System.Type type, string serializedState, System.Collections.Generic.List<UnityEngine.Object> objectReferences) Line 87 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.JSONSerializer.Deserialize<NodeCanvas.Framework.Internal.GraphSerializationData>(string serializedState, System.Collections.Generic.List<UnityEngine.Object> objectReferences) Line 61 Unknown
    Assembly-CSharp.dll!NodeCanvas.Framework.Graph.Deserialize(string serializedGraph, bool validate, System.Collections.Generic.List<UnityEngine.Object> objectReferences) Line 131 Unknown
    Assembly-CSharp.dll!NodeCanvas.Framework.Graph.OnAfterDeserialize() Line 63 Unknown
    Assembly-CSharp.dll!FlowCanvas.Macros.Macro.Unity_Deserialize(int depth) Unknown
    UnityEngine.dll!UnityEngine.Internal.Types.$UnityType3043.$Invoke0Unity_Deserialize(long instance, long* args) Unknown
    UnityEngine.dll!UnityEngine.Internal.$MethodUtility.InvokeMethod(long instance, long* args, System.IntPtr method) Unknown

    + $exception {"Cannot create an instance of an interface or abstract type for NodeCanvas.Framework.Variable"} System.Exception

    > Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsMetaType.CreateInstance() Line 299 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.Internal.fsReflectedConverter.CreateInstance(ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType) Line 102 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_3_Inheritance(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result, out System.Collections.Generic.List<ParadoxNotion.Serialization.FullSerializer.fsObjectProcessor> processors) Line 818 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_1_CycleReference(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result, out System.Collections.Generic.List<ParadoxNotion.Serialization.FullSerializer.fsObjectProcessor> processors) Line 723 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.TryDeserialize(ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, System.Type overrideConverterType, ref object result) Line 685 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.TryDeserialize(ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result) Line 659 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.Internal.fsDictionaryConverter.TryDeserialize(ParadoxNotion.Serialization.FullSerializer.fsData data, ref object instance_, System.Type storageType) Line 51 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_5_Converter(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type resultType, ref object result) Line 860 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_4_Cycles(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type resultType, ref object result) Line 852 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_3_Inheritance(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result, out System.Collections.Generic.List<ParadoxNotion.Serialization.FullSerializer.fsObjectProcessor> processors) Line 831 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_1_CycleReference(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result, out System.Collections.Generic.List<ParadoxNotion.Serialization.FullSerializer.fsObjectProcessor> processors) Line 723 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.TryDeserialize(ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, System.Type overrideConverterType, ref object result) Line 685 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.Internal.fsReflectedConverter.TryDeserialize(ParadoxNotion.Serialization.FullSerializer.fsData data, ref object instance, System.Type storageType) Line 88 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_5_Converter(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type resultType, ref object result) Line 860 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_4_Cycles(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type resultType, ref object result) Line 852 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_3_Inheritance(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result, out System.Collections.Generic.List<ParadoxNotion.Serialization.FullSerializer.fsObjectProcessor> processors) Line 831 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.InternalDeserialize_1_CycleReference(System.Type overrideConverterType, ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result, out System.Collections.Generic.List<ParadoxNotion.Serialization.FullSerializer.fsObjectProcessor> processors) Line 723 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.TryDeserialize(ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, System.Type overrideConverterType, ref object result) Line 685 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.FullSerializer.fsSerializer.TryDeserialize(ParadoxNotion.Serialization.FullSerializer.fsData data, System.Type storageType, ref object result) Line 659 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.JSONSerializer.Deserialize(System.Type type, string serializedState, System.Collections.Generic.List<UnityEngine.Object> objectReferences) Line 87 Unknown
    Assembly-CSharp.dll!ParadoxNotion.Serialization.JSONSerializer.Deserialize<NodeCanvas.Framework.Internal.BlackboardSource>(string serializedState, System.Collections.Generic.List<UnityEngine.Object> objectReferences) Line 61 Unknown
    Assembly-CSharp.dll!NodeCanvas.Framework.Blackboard.OnAfterDeserialize() Line 43 Unknown
    Assembly-CSharp.dll!NodeCanvas.Framework.Blackboard.Unity_Deserialize(int depth) Unknown
    UnityEngine.dll!UnityEngine.Internal.Types.$UnityType3043.$Invoke0Unity_Deserialize(long instance, long* args) Unknown
    UnityEngine.dll!UnityEngine.Internal.$MethodUtility.InvokeMethod(long instance, long* args, System.IntPtr method) Unknown
     
  50. nuverian

    nuverian

    Joined:
    Oct 3, 2011
    Posts:
    2,087
    Hello again,

    Thanks for the further info.
    I unfortunately have not yet tested FlowCanvas support for Hololens, and will do so once it is out of beta/technical preview.
    If you want, it would be great to please create a post in the official forums so that we can track and elaborate the issues better.

    Thanks you.