Search Unity

[RELEASED] Google Sheets For Unity Lite

Discussion in 'Assets and Asset Store' started by Novack, Mar 3, 2014.

  1. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Hello @gugz,

    Got your email. What you're experiencing does not seem to be an actual GSFU issue, as I have created multiple tables in the same fashion, with multiple simultaneous calls, and correct results.

    You mention the responses, however you do not specify result details. What do you see as return in the console? Have you peek into the console details to try to debug the situation?

    On cases like this, I always recommend to return to the basics: Use a fresh Unity project, deploy the asset as per the manual indications, and make it work as intended. Then, you can do a quick test: in the included demo, go to the class GSFU_Demo_Utils class, and at the very bottom of the CreatePlayerTable method, change:

    This:
    Code (CSharp):
    1.        // Request for the table to be created on the cloud.
    2.        CloudConnectorCore.CreateTable(fieldNames, tableName, runtime);
    Into this:
    Code (CSharp):
    1.        CloudConnectorCore.CreateTable(fieldNames, "tableA", runtime);
    2.        CloudConnectorCore.CreateTable(fieldNames, "tableB", runtime);
    3.        CloudConnectorCore.CreateTable(fieldNames, "tableB", runtime);
    You will notice that this works as intended. So once you get this working, elaborate and work until you get the desired results on your own project.

    Hope it helps!
     
  2. Jos-Yule

    Jos-Yule

    Joined:
    Sep 17, 2012
    Posts:
    292
    Hello!

    I'm liking this tool so far. I have 2 feature suggestions, which i'm working on now myself.

    1) A new type of CREATE which over-writes existing items - a CREATE combined with UPDATE, in the case where the item already exists.
    2) A way to CREATE more then 1 item in a single API call, so CREATE would take an array or list of Dict<string, string> instances.

    The reason for 1 is that, i may not know if an item exists on the google side, and i just want to save it and not worry about Updating vs. Creating. And, sometimes, i want to update multiple fields at the same time, rather then having to do each individually. I know there is a potential issue with Key duplication, but i'm ensuring that there is always 1 column that is the "unique" or "identifier" key.

    Thanks for the great product,
    Jos
     
    Novack likes this.
  3. Jos-Yule

    Jos-Yule

    Joined:
    Sep 17, 2012
    Posts:
    292
    I just realized that really it would more be an UPDATE-CREATE, as create just takes the item and creates a new row. I'd want to use some of the UPDATE API, where you can define the SEARCH term, and then update that row(s). But send the whole object, so if there is no found object, you create a new one with that data... And really, i'm looking for something more... Database like i guess... which this isn't because Spreadsheets are not databases. Maybe i need to re-think how i'm doing what i'm doing.
     
    Novack likes this.
  4. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Hey @Jos-Yule, thanks for some great suggestions.

    No objections to your thinking. The only thing I need to measure carefully is the feature creep. Really the included API was intended as a starting point, and as people use it they found the limitations compared to a full blown DB approach. As you properly indicate, the asset wont provide the same, but you could extend it to the point where its functional for your purposes. The balance is the hard part: at what point you are adding options and flexibility to a daily tool, or just overworking something that a different solution would handle better.

    Anyway, thanks for the kind words, and always glad to chat with you guys. Greetings to Tony and the rest of the crew.
     
  5. TobiasW

    TobiasW

    Joined:
    Jun 18, 2011
    Posts:
    91
    Hi @Novack!

    I am using your asset to send multiple table requests after each other. The callback was executed the same amount of times, but every time it only showed only the result of the last request.

    This bug is very easy to fix in CloudConnector.cs:

    Instead of having a field "private UnityWebRequest www;", include the UnityWebRequest object in the ExecuteRequest method as a parameter:

    Code (CSharp):
    1. IEnumerator ExecuteRequest(UnityWebRequest www, Dictionary<string, string> postData)
    Apart from that, everything is working quite well so far. Thanks for the asset!

    edit: Reading back, this might also solve @gugz's problem.
     
    Novack likes this.
  6. Delahoyhoy

    Delahoyhoy

    Joined:
    Apr 29, 2016
    Posts:
    3
    Hey @Novack,

    We were looking to use this tool as a way of updating our game's metadata while we're live. So for example we would have a google spreadsheet that would say: Lives 3, Health 50. Then when we decide that we want to change Lives to 10 on the sheet, we would make the edit and the game (if you're connected to the web) would automatically download the new data.

    Do you think that your tool would work for this kind of interaction?

    Thanks,
    Oscar
     
  7. Jos-Yule

    Jos-Yule

    Joined:
    Sep 17, 2012
    Posts:
    292
    Ok, i've got a couple suggestions and a request!

    Your Unity Events. You need to add the [System.Serializable] attribute to their classes. This is suggested in the docs, and makes them usable in-editor scripting (otherwise they don't work in-editor). Also, you don't have to create more then 1 UnityEventXXX for each type. I tend to do things like 'public class UnityEventString : UnityEvent<string {}', and then if i need a unity event which sends a string, i use that. The class of the UnityEvent doesn't matter so much as the arguments it takes, and the name of the instance/var/field.

    Also, I would like an error callback event (i've already added this to the code). Here is the "event" section as i have it now:

    Code (CSharp):
    1.  
    2.     [System.Serializable]
    3.     public class UnityEventString : UnityEvent<string> {}
    4.  
    5.     [System.Serializable]
    6.     public class UnityEventProcessedResponse : UnityEvent<QueryType, List<string>, List<string>> {}
    7.  
    8.  
    9.     // Suscribe to this event if want to handle the response as it comes.
    10.     public static UnityEventString rawResponseCallback = new UnityEventString();
    11.  
    12.  
    13.     // Suscribe to this event if want the response pre processed.
    14.     public static UnityEventProcessedResponse processedResponseCallback = new UnityEventProcessedResponse();
    15.  
    16.     // Subscribe to this event if you want to receive error callbacks.
    17.     public static UnityEventString errorResponseCallback = new UnityEventString();
    18.  
    Then i'm triggering the error callback here:

    Code (CSharp):
    1.  
    2.             case MSG_CONN_ERR:
    3.                 logOutput = errorMsg;
    4.                 errorResponseCallback.Invoke(logOutput);
    5.                 break;
    6.            
    I'm working on a nice Editor Extension for dealing with external data of different types, here is the UI so far:



    thanks for the great package!
     
  8. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Hello people, thanks for the messages and sorry about the delay in answering. Have been hectic, and Im finding it hard to take time apart to be around here as well.

    That being said, I'll answer below some of the missing posts.
     
  9. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    @TobiasW thanks for reporting that. Im not entirely sure what you mean by multiple table requests. You can try using the included demo and see that each function works fine, so not sure if what you mention is indeed a bug, or an emergent behaviour of a specific use case you have. Either way, Im glad you solved it, and I really appreciate the time you took to report and offer a solution.

    Will check on it next round of polishin on the asset :)
     
  10. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    @Delahoyhoy that case seems perfectly within the bounds of Google Sheets For Unity capabilities :)
     
    Delahoyhoy likes this.
  11. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    @Jos-Yule once again, thank you for your feedback and advise, very appreciated.
    Man, that editor looks slick :cool: Good job!

    Regarding your suggestions, Im taking notes, and will work on that as soon as I start the next round of polish. Truth be told, Im having a hard time allocating time to work on the asset now, but sooner or later I will be on it again :)

    Thanks again!
     
  12. yeojoey

    yeojoey

    Joined:
    Feb 20, 2016
    Posts:
    7
    Hey @Novack, I've been using your script at work and it's been a really great help with what we are doing, so thanks for such a great tool!

    Pardon if this has already been asked or is already somewhere in the documentation, but what's the best way to go about writing multiple rows to the sheet at once? I've been calling CreateObject for every item in a list but it seems like it misses out some of the entries -- I've tried to write a list of 10 things but only 5 or 6 rows appear in the sheet, for instance.
     
    Novack likes this.
  13. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Hello @yeojoey thank you man! :)

    Depending on the missing data, it may be due to limitations in the Unity Json serializer (check the official docs). If it is indeed a case of unsopprted types, you may need to refactor your code a bit, either by using different types, using wrappers, or replacing the unity json serialization altogether by something like LitJson or Json.net

    It may be worth adding a few debug lines to check how the json serialized data looks like.
     
    yeojoey likes this.
  14. yeojoey

    yeojoey

    Joined:
    Feb 20, 2016
    Posts:
    7
    Thanks for the quick response!

    I've checked the Json serialization and it seems to be valid (I'm testing with a really simple object { "answer" : "yes" }) and the console shows that the objects were all saved correctly, but I'm still missing data. What else do you think could be the cause? :confused:
     
    Novack likes this.
  15. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Sorry, that was not what I meant. Read the docs I posted, the serializer may be ignoring unsopported types, effectively cutting out part of your object in the resulting json string. If what you see in the json output has missing fields, it is indeed related to the json serialization.
     
  16. yeojoey

    yeojoey

    Joined:
    Feb 20, 2016
    Posts:
    7
    The Json output doesn't have missing fields, and I think my struct is serializable? What I'm doing is:
    Code (CSharp):
    1.     [Serializable]
    2.     public struct SurveyResponse
    3.     {
    4.         public string answer;
    5.        
    6.         public SurveyResponse (string answer) {
    7.             this.answer = answer;
    8.         }
    9.     }
    10.  
    11.     public void Write()
    12.     {
    13.         foreach (SurveyResponse response in _responses) {
    14.             CloudConnectorCore.CreateObject (JsonUtility.ToJson (response), "Sheet1", true);
    15.         }
    16.     }
    17.  
     
    Novack likes this.
  17. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    I see what you mean now. You mean missing objects, not missing fields (my bad). It may relate to some somehow similar recent reports. I have not yet experienced this myself, so I cant know for certain, but it seems like will need to add some concurrency checks to the webapp service, to avoid missing rows on fast paced multiple calls to the webservice.

    To confirm this, try, if possible, to make an artificial pause between calls, of maybe a second or two. If it works correctly that way, then we have a case :)
     
    yeojoey likes this.
  18. yeojoey

    yeojoey

    Joined:
    Feb 20, 2016
    Posts:
    7
    I put a 0.5 second delay between calls and that seems to have fixed it! Though I'm still wondering if there's a more optimal way to do this, in case the list of data gets really long?
     
    Novack likes this.
  19. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Thanks for your help @yeojoey!

    Indeed, that was just a test (that also works as bandaid). To implement a definitive solution, it requires changes for correct handling of access concurrency in the webservice code. Google's API for that is called Lock Service, and by making proper use of it, the problem will be solved the good way. However, I have no ETA for the next asset point release (too much day work atm), so please dont have expectatiions. That being said, I will do my best to have something out of the door as soon as possible.
     
    yeojoey likes this.
  20. yeojoey

    yeojoey

    Joined:
    Feb 20, 2016
    Posts:
    7
    No worries, I can work with this workaround for now! And thanks so much for the quick and informative support! :)
     
  21. Wikzo-DK

    Wikzo-DK

    Joined:
    Sep 6, 2012
    Posts:
    83
    Hi. We are testing a game and saving data to a dictionary ("completion_time", "deaths", "levelCompleted" etc.). I save this into a local CSV .txt AND send it via the custom events in Unity Analytics. However, when we do remote testing, it is not possible to retrieve the local .txt file, so we rely on Unity Analytics.

    I just discovered that I cannot retrieve the raw data from Analytics (without a Pro subscription), meaning I can get "average completion time", but I cannot get the actual data and look at completion time for the actual level that was completed. This makes Unity Analytics almost useless for me.

    So, I just want to know if you think this plugin would be useful for me? In the end, I just want to import the data into a spreadsheet (Excel or Google Drive) to make my own statistics.

    It would look something like this:

     
  22. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    @Wikzo-DK Hi. Apologies for the delay. Yes that is totally possible, and seems like a typical use case, although you would need to use something else than dictionaries as per Unity json serialization limitations. The asset provides an scheme using arrays of structs.

    Hope it helps!
     
  23. Wikzo-DK

    Wikzo-DK

    Joined:
    Sep 6, 2012
    Posts:
    83
    Cool, thanks!
     
  24. sama-van

    sama-van

    Joined:
    Jun 2, 2009
    Posts:
    1,734
    @Novack

    Hi!

    Is there a way to download the Googlesheet as plain text such as the *.tsv does?
    Google API Python let you download a targeted google sheet as every row and column saved as a string [ ] [ ].

    That would be very helpful...

    Thank you! ^_^/

    EDIT : Actually as the .net API does :
    https://developers.google.com/sheets/api/quickstart/dotnet
    Would love using the QuickStart exemple as I do in Python but the Google.Apis doesn't load even imported into Unity :(
     
  25. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Hello @sama-van,
    You can download any worksheet data in full using available GSFU API, and then process the content yourself and output a tsv file. It should not be a problem, but the asset does not provide this by itself.
     
  26. sama-van

    sama-van

    Joined:
    Jun 2, 2009
    Posts:
    1,734
    Finally ended up with File>Publish>as*.tsv which provide an URL I can access via www class only!!
    The url content is automatically updated on file edition with a few seconds delay which is totally fine.
    I parse the file myself since I am doing the exact same with Maya-Python. ;)
     
  27. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Glad you solved it.
     
    sama-van likes this.
  28. AllanMSmith

    AllanMSmith

    Joined:
    Oct 2, 2012
    Posts:
    180
    Hey,

    I was looking at your plugin and I am thinking of purchasing it but I got a question first. Can I easily insert data from unity into a google sheet? Can I somehow pass filters... for example, what I need is to insert a value into a cell, where the row of the cell matches a few values in a few columns... so basically I need to query the sheet to know the right row to edit.

    Thanks for the attention,
    Best,
    Allan
     
  29. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Hey @AllanMSmith,

    Yes, you can do that. The asset provides a very simple API oriented towards database-like simple operations. Among them, there an Update method, in which you can provide a field to look for, and what content it should match, and the new value to be set in the case of finding the "object".

    Hope it helps!
     
  30. TorreyD12

    TorreyD12

    Joined:
    Aug 22, 2014
    Posts:
    3
    Hey @Novack

    I've recently started using GSFU2, and I love it.

    I've followed the setup instructions exactly.
    I even have the demos working perfectly.

    However, I've run into an issue.
    Using the same sheet created in the demo, I manually added a new table through Sheets. Each entry on the table is a string. When I call "GetTable" I can see the raw string being returned from Sheets which contains the correct entries, but when it comes to parsing and storing into a struct like in the runtime demo, all the strings are returned as null.

    The asset works so well with the demos, so I believe there's something I missed.
    Any ideas?

    Thanks,
    Torrey
     
  31. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Hey @TorreyD12, glad you're liking the asset! :)

    When you add new tables (worksheets) to the spreadsheet, you need to also feed the unity side with the equivalent struct. The demos use a demo struct matching the fields available on the demo table. Follow the code and you will find pretty easily where is the struct used by the example, and where you must use yours.
     
  32. TorreyD12

    TorreyD12

    Joined:
    Aug 22, 2014
    Posts:
    3
    *facepalm*

    That's what it was. I've seen the struct from the demo before and noticed that the fields matched, but what I didn't notice was how I tend to name my variables.

    ie: string s_name = "Name"

    The variable names weren't matching the first row's field names in the worksheet. Not sure how I missed that one.

    Problem solved! Thanks!
     
    Novack likes this.
  33. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Very glad you solved it man! Good luck!
     
  34. Dontre

    Dontre

    Joined:
    Oct 21, 2014
    Posts:
    2
    Hello! Can you please help me. I am trying to get the spreadsheet from google docs in editor mode, but it recieves that
    I don`t know what is wrong. In browser get request works fine.
     
    Novack likes this.
  35. Dontre

    Dontre

    Joined:
    Oct 21, 2014
    Posts:
    2
    I solved this problem. Forgot to open access to script for anonymous users.
     
    Novack likes this.
  36. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Glad you solved it @Dontre, thank you for the update.
     
  37. richardzzzarnold

    richardzzzarnold

    Joined:
    Aug 2, 2012
    Posts:
    142
    Hi
    I am happily using GSFU but have come across a confusing situation.
    I can upload details to a GoogleSheet.
    But, when I exit the scene and then re-enter the scene to upload more details it crashes with the following error.log:
    For some reason it doesn't want to create an instance of CloudConnector the second time I open the scene.
    I really cannot understand what is going on here..


    MissingReferenceException: The object of type 'CloudConnector' has been destroyed but you are still trying to access it.
    Your script should either check if it is null or you should not destroy the object.
    UnityEngine.MonoBehaviour.StartCoroutine (IEnumerator routine) (at /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/MonoBehaviourBindings.gen.cs:62)
    CloudConnector.CreateRequest (System.Collections.Generic.Dictionary`2 form) (at Assets/CloudTools/GSFU 2.0/CloudConnector.cs:50)
    CloudConnectorCore.SendRequest (System.Collections.Generic.Dictionary`2 form, Boolean runtime) (at Assets/CloudTools/GSFU 2.0/CloudConnectorCore.cs:269)
    CloudConnectorCore.UpdateObjects (System.String objTypeName, System.String searchFieldName, System.String searchValue, System.String fieldNameToUpdate, System.String updateValue, Boolean runtime) (at Assets/CloudTools/GSFU 2.0/CloudConnectorCore.cs:183)
    GSFU_Demo_Utils.UpdateCarerDetails_1_ (System.String uniqueID, System.String newName1, System.String newNumber1) (at Assets/CloudTools/GSFU 2.0/GSFU_Demo_Utils.cs:116)
    AddPhoneContacts.SaveDetails () (at Assets/SCRIPTS/AddPhoneContacts.cs:216)
    UnityEngine.Events.InvokableCall.Invoke () (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:160)
    UnityEngine.Events.UnityEvent.Invoke () (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:58)
    UnityEngine.UI.Button.Press () (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:36)
    UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:45)
    UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:50)
    UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at /Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:261)
    UnityEngine.EventSystems.EventSystem:Update()
     
    Last edited: Nov 30, 2017
  38. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Hello @richardzzzarnold,

    Few days ago, I answered an email on a related issue you had. Im afraid the line of reasoning for this issue you describe, goes on the same line. How you elaborate your own implementation and handle very basic stuff like scene changes is beyond the scope (or area of interest) of the asset.

    You seem to be losing the reference to a GSFU class, but how, when, and why, is not really something I can help with, because is not related to the asset itself: you will need to go through standard debugging and see if your app implementation is consistent with your design.

    Hope it helps!
     
  39. jack0073j

    jack0073j

    Joined:
    Sep 28, 2013
    Posts:
    1
    Hi, I have a problem with this plugin, if I use this plugin can l upload the data to Google sheet at runtime?
     
  40. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Hello @jack0073j,

    Yes, you can upload data to a Google Spreadsheet at runtime :)
     
  41. pseudowok

    pseudowok

    Joined:
    Jan 3, 2013
    Posts:
    3
    Hi, quick question. I want to make a unity game where users can type in the address of a publicly shared google sheet. This sheet could be located in their google drive or on someone else's, but it would be shared to anyone with the link.

    Can your asset import such a sheet? Or would the sheet need to belong to a specific account? Can it do this using just the shared link?

    Thanks for your time!
     
  42. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Hey @pseudowok

    It is actually a good question. I cant remember at this point, so I will have to do some tests because Google API docs are not entirely helpful with this. It is surely not the standard case, but maybe ids of publicly shared spreadsheets *may* work.

    Will test as oon as I can, and report back.
     
  43. JonBowen

    JonBowen

    Joined:
    Jan 23, 2017
    Posts:
    1
    Hey, thanks for the reply. I actually just finished a proof of concept, which will probably do the trick, using an API key and a unity webrequest. Just gotta get the parsing done. Thanks though!
     
    Novack likes this.
  44. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Good work then, and good luck!
     
  45. Nimdanet

    Nimdanet

    Joined:
    Jan 19, 2013
    Posts:
    38
    Hello! I'm very interested on this, but I need it to work with WebGL. Do you have updated already? The last update was on 2016, so you might have updated already. Let me know if you do.
     
  46. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Hello @Nimdanet

    Im afraid, not, day job has not allowed me much time to work on the assets. Thanks for asking, I will keep people posted when I work on something.
     
  47. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    @Everyone a quick fix/note:

    On late Unity versions the WebRequest API has been modified, and the Send() method has been marked as obsolete.
    This may result on annoying console warnings, and some people has even reported malfunctions.

    This affects all the Cloud Suite assets: Google Sheets For Unity, CloudPlayer, CloudConsole, CloudPrefs, and CloudImages.

    To fix this, until I can update the assets to new versions, please open the <*>Connector<*> class (naming varies depending the asset) and change the line:

    Code (CSharp):
    1. www.Send();
    to:
    Code (CSharp):
    1. www.SendWebRequest();
    Thats it for now, that should handle any issues until I can elaborate and a new version be released.
    Thanks!
     
  48. Kiupe

    Kiupe

    Joined:
    Feb 1, 2013
    Posts:
    528
    Hi,

    How does GSFU store data in Unity side ? I was wondering if within the editor GSFU can retrieve datas from Google Doc and store them inside a specific scriptable object for instance ?

    Thanks
     
  49. Novack

    Novack

    Joined:
    Oct 28, 2009
    Posts:
    844
    Hello @Kiupe

    GSFU wont do data persistance on client side. For Unity there is a good amount of different solutions to save data, so there was little point on going there.

    In practical terms, the data retrieved from the Google spreadsheet is put into structs, so you can do whatever suits better fr your case.

    If the operation for contacting the cloud will be from within Unity editor, not in the builds runtime, then the scriptable object could be a very good and practical solution indeed :)
     
  50. Kiupe

    Kiupe

    Joined:
    Feb 1, 2013
    Posts:
    528
    Thanks for the answer. Is there any online documentation ? I have trouble to understand how it works from within the editor. I'd like to understand the workflow before purchase the GSFU. For example, how to retrieve data and set when/how the data should be store in Unity side.

    Thanks