Announcement

Collapse
No announcement yet.

Runtime DataTable - Import text CSV or Google Sheet at runtime and fill an array of structs!

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    [RELEASED] Runtime DataTable - Import text CSV or Google Sheet at runtime and fill an array of structs!

    This plugin will load a text csv or download a public Google Sheet and add parsed values to a matching USTRUCT at Runtime. All data types supported by the built-in UE4 DataTable are supported by this plugin.

    Price: $9.99

    Link:
    https://unrealengine.com/marketplace...time-datatable

    Runtime Data Table or “RDT” is a plugin for Unreal Engine 4 that loads a Comma-Separated Values or CSV document at runtime with a USTRUCT’s variables in text form and fills an array of that USTRUCT with the appropriate values, converting text into the appropriate type.

    RDT can be likened to the Data Table system built into UE4, but while that system works only at design time, this plugin is made to work while the game is running.

    The system works by downloading a public Google Sheet or loading a CSV from disk and attempts to fill an array of USTRUCTS with values loaded and converted from the CSV. After the attempt is made, the plugin will call a function defined by the user to signal that the plugin has finished its duties.

    Features:
    • Runtime parsing of Data Tables
    • Automatic filling of USTRUCTs
    • Connectivity with Google Sheets - edit values on the fly, no need to reimport CSVs manually

    Code Modules:
    • Runtime Data Table: A runtime module that handles the download/ and parsing,

    Number of Blueprints: 7

    Number of C++ Classes: 2

    Network Replicated: No

    Supported Development Platforms: Win64, Mac

    Supported Target Build Platforms: Win32, Win64, Android, Mac, iOS (+tvOS as of 4.25)

    Documentation: Documentation is found here and in the Resources folder.

    Demo: A Win32 packaged demo can be found here. Includes a TestStruct.csv (WindowsNoEditor\CSV_Test\Saved) that can be edited with the results showing in-game on-demand when 'Execute It' is clicked.

    What Is Runtime Data Table and Please Video-Teach Me How to Use This Thing So I Don't Have To Read
    Last edited by Jared Therriault; 05-09-2020, 04:52 PM.
    Procedural, modular, on-the-fly animation - iTween For UE4
    - Actors - Components - UMG - Ease In - Ease Out - Path-constrained Animation - $0

    Runtime Datatable
    -All the fun of DataTables dynamically loaded from text or Google Sheets while your game is running!

    #2
    Was thinking about this exact thing. I know you've listed this as not being network replicated, but do you see any issue having this work with a networked scenario, assuming i update all clients datatables via google drive, or other cloud save?

    Comment


      #3
      Originally posted by MagicBots View Post
      Was thinking about this exact thing. I know you've listed this as not being network replicated, but do you see any issue having this work with a networked scenario, assuming i update all clients datatables via google drive, or other cloud save?
      Hi MagicBots! Thank you for stopping by. I don't think there is any issue to be encountered in a networked scenario if you design for it. I think there are a few options you have:
      • Have each client download the sheet (or load a local CSV)
      • Have the server download the sheet (or provide a master CSV) and replicate the array of structs manually
      • Have the server download the sheet (or provide a master CSV) and have each client request a copy of its associated struct by providing a key name
      Procedural, modular, on-the-fly animation - iTween For UE4
      - Actors - Components - UMG - Ease In - Ease Out - Path-constrained Animation - $0

      Runtime Datatable
      -All the fun of DataTables dynamically loaded from text or Google Sheets while your game is running!

      Comment


        #4
        Android support is now live! Mac and iOS support may be added as soon as this week!
        Procedural, modular, on-the-fly animation - iTween For UE4
        - Actors - Components - UMG - Ease In - Ease Out - Path-constrained Animation - $0

        Runtime Datatable
        -All the fun of DataTables dynamically loaded from text or Google Sheets while your game is running!

        Comment


          #5
          Mac OS and iOS support are now live!

          Keep in mind I am unable to test iOS support right now.

          All other supported platforms are fully tested! If you have issues on any platform, please contact me first so I can deploy a fix, please do not leave a bad review first!
          Procedural, modular, on-the-fly animation - iTween For UE4
          - Actors - Components - UMG - Ease In - Ease Out - Path-constrained Animation - $0

          Runtime Datatable
          -All the fun of DataTables dynamically loaded from text or Google Sheets while your game is running!

          Comment


            #6
            Hello, Jared!
            How complicated is it to edit data of the Google sheet during play? I saw that you mentioned it is possible, would you perhaps have time to show how to set that up?
            Plugin looks great either way - will probably jump on it when I get the time to try out my next project!

            Comment


              #7
              Originally posted by Connecta View Post
              Hello, Jared!
              How complicated is it to edit data of the Google sheet during play? I saw that you mentioned it is possible, would you perhaps have time to show how to set that up?
              Plugin looks great either way - will probably jump on it when I get the time to try out my next project!
              Hola Connecta!

              To be clear, you can manually edit a Google Sheet during gameplay by editing the spreadsheet through web. There is no way through the Google API (as of now) to edit from third party code - but I'll keep looking into that.

              If you want to edit a CSV at runtime through code this can be user-managed with the save and load text functions included with the plugin, but the plugin doesn't manage that as of now. If this is a feature you'd like, could you explain the use case? I'll need to understand your needs before I can analyze the cost-benefit relationship.
              Procedural, modular, on-the-fly animation - iTween For UE4
              - Actors - Components - UMG - Ease In - Ease Out - Path-constrained Animation - $0

              Runtime Datatable
              -All the fun of DataTables dynamically loaded from text or Google Sheets while your game is running!

              Comment


                #8
                4.24 update has been posted and is pending Epic approval!

                No new features this time, but some crash fixes. HTML5 support has also been removed as the engine itself no longer supports HTML5 as of 4.24. The 4.23 version still supports HTML5.

                Keep an eye out for the update in the next couple of days!
                Procedural, modular, on-the-fly animation - iTween For UE4
                - Actors - Components - UMG - Ease In - Ease Out - Path-constrained Animation - $0

                Runtime Datatable
                -All the fun of DataTables dynamically loaded from text or Google Sheets while your game is running!

                Comment


                  #9
                  Hey, I dont know why but since i have installed the plugin i can't package my game. If I go to File> Package Project and select a Platform the browser just opens this link: https://docs.unrealengine.com/en-US/...ial/index.html
                  If I disable the plugin, everything works fine.

                  Comment


                    #10
                    Originally posted by SupremeSarah乡 View Post
                    Hey, I dont know why but since i have installed the plugin i can't package my game. If I go to File> Package Project and select a Platform the browser just opens this link: https://docs.unrealengine.com/en-US/...ial/index.html
                    If I disable the plugin, everything works fine.
                    That's interesting, I haven't seen a similar behaviour. Does this happen for every platform you choose or a specific one? Do you have Android packaging set up?
                    Procedural, modular, on-the-fly animation - iTween For UE4
                    - Actors - Components - UMG - Ease In - Ease Out - Path-constrained Animation - $0

                    Runtime Datatable
                    -All the fun of DataTables dynamically loaded from text or Google Sheets while your game is running!

                    Comment


                      #11
                      Hey Jared, the plugin is an absolute lifesaver, it's becoming quite indispensable for my development needs! However I've begun to experience a weird crash in a blueprint that was working perfectly before. Here's the log:

                      Code:
                      Assertion failed: IsValidIndex(Index) [File:D:\RocketSync\4.24.0-10570792+++UE4+Release-4.24\Working\Engine\Source\Runtime\Core\Public\Containers/UnrealString.h] [Line: 203] String index out of bounds: Index -1 from a string with a length of 0
                      
                      UE4Editor_Core
                      UE4Editor_Core
                      UE4Editor_DynamicDataTable!DispatchCheckVerify<void,<lambda_7ac18e318f0622d6f9f0239f5e3d2fcc> >() [d:\rocketsync\4.24.0-10570792+++ue4+release-4.24\working\engine\source\runtime\core\public\misc\assertionmacros.h:168]
                      UE4Editor_DynamicDataTable!ARuntimeDataTableActor::ReadCSVRow() [d:\build\++portal+dev-marketplace+full\sync\localbuilds\plugintemp\hostproject\plugins\dynamicdatatable\source\dynamicdatatable\private\dynamicdatatable.cpp:174]
                      UE4Editor_DynamicDataTable!ARuntimeDataTableActor::MakeMapFromString() [d:\build\++portal+dev-marketplace+full\sync\localbuilds\plugintemp\hostproject\plugins\dynamicdatatable\source\dynamicdatatable\private\dynamicdatatable.cpp:135]
                      UE4Editor_DynamicDataTable!ARuntimeDataTableActor::FillStructArrayFromString() [d:\build\++portal+dev-marketplace+full\sync\localbuilds\plugintemp\hostproject\plugins\dynamicdatatable\source\dynamicdatatable\private\dynamicdatatable.cpp:369]
                      UE4Editor_DynamicDataTable!ARuntimeDataTableActor::PayloadReceiptInternal() [d:\build\++portal+dev-marketplace+full\sync\localbuilds\plugintemp\hostproject\plugins\dynamicdatatable\source\dynamicdatatable\private\dynamicdatatable.cpp:87]
                      UE4Editor_DynamicDataTable!ARuntimeDataTableActor::execPayloadReceiptInternal() [d:\build\++portal+dev-marketplace+full\sync\localbuilds\plugintemp\hostproject\plugins\dynamicdatatable\source\dynamicdatatable\private\dynamicdatatable.h:53]
                      UE4Editor_CoreUObject
                      UE4Editor_CoreUObject
                      UE4Editor_Engine
                      UE4Editor_DynamicDataTable!TMulticastScriptDelegate<FWeakObjectPtr>::ProcessMulticastDelegate<UObject>() [d:\rocketsync\4.24.0-10570792+++ue4+release-4.24\working\engine\source\runtime\core\public\uobject\scriptdelegates.h:488]
                      UE4Editor_DynamicDataTable!ARuntimeDataTableActor::OnResponseReceived() [d:\build\++portal+dev-marketplace+full\sync\localbuilds\plugintemp\hostproject\plugins\dynamicdatatable\source\dynamicdatatable\private\dynamicdatatable.cpp:61]
                      UE4Editor_DynamicDataTable!TBaseUObjectMethodDelegateInstance<0,ARuntimeDataTableActor,void __cdecl(TSharedPtr<IHttpRequest,0>,TSharedPtr<IHttpResponse,1>,bool)>::ExecuteIfSafe() [d:\rocketsync\4.24.0-10570792+++ue4+release-4.24\working\engine\source\runtime\core\public\delegates\delegateinstancesimpl.h:709]
                      UE4Editor_HTTP
                      UE4Editor_HTTP
                      UE4Editor_HTTP
                      UE4Editor_Core
                      UE4Editor_Core
                      UE4Editor_Core
                      UE4Editor_Core
                      UE4Editor
                      UE4Editor
                      UE4Editor
                      UE4Editor
                      UE4Editor
                      kernel32
                      ntdll
                      And a snapshot of the BP:

                      Click image for larger version

Name:	cTA9D7q1.png
Views:	1254
Size:	368.2 KB
ID:	1721864

                      It seems to be crashing on the Fill Struct Array node.
                      I can also provide the sheet/blueprint if needed. Thanks in advance!

                      Comment


                        #12
                        Originally posted by mediochrea View Post
                        Hey Jared, the plugin is an absolute lifesaver, it's becoming quite indispensable for my development needs! However I've begun to experience a weird crash in a blueprint that was working perfectly before.

                        (snip)

                        It seems to be crashing on the Fill Struct Array node.
                        I can also provide the sheet/blueprint if needed. Thanks in advance!
                        Thank you for the kind words and for reporting this bug mediochrea! I believe I've corrected this specific issue through brute force by asserting that the length of the FieldIndex should be greater than 0 to continue the operation. I do think there might be an underlying issue here though, so would you be able to send the sheet to me in a private message? My assumption here is that a field might be left blank when the script thinks there should be text. I've designed it to handle this without crashing but edge cases always exist To try to fix the issue on your end, please make sure every field in the CSV has text and with your help I will try to track down why this crash happens exactly!
                        Procedural, modular, on-the-fly animation - iTween For UE4
                        - Actors - Components - UMG - Ease In - Ease Out - Path-constrained Animation - $0

                        Runtime Datatable
                        -All the fun of DataTables dynamically loaded from text or Google Sheets while your game is running!

                        Comment


                          #13
                          Originally posted by Jared Therriault View Post

                          Thank you for the kind words and for reporting this bug mediochrea! I believe I've corrected this specific issue through brute force by asserting that the length of the FieldIndex should be greater than 0 to continue the operation. I do think there might be an underlying issue here though, so would you be able to send the sheet to me in a private message? My assumption here is that a field might be left blank when the script thinks there should be text. I've designed it to handle this without crashing but edge cases always exist To try to fix the issue on your end, please make sure every field in the CSV has text and with your help I will try to track down why this crash happens exactly!
                          Just sent you a PM!

                          Comment


                            #14
                            Originally posted by mediochrea View Post

                            Just sent you a PM!
                            Thanks a ton! I'll take a look.
                            Procedural, modular, on-the-fly animation - iTween For UE4
                            - Actors - Components - UMG - Ease In - Ease Out - Path-constrained Animation - $0

                            Runtime Datatable
                            -All the fun of DataTables dynamically loaded from text or Google Sheets while your game is running!

                            Comment


                              #15
                              Jared Therriault first off I LOVE this plugin and the video resources your created are amazing. Currently I am working on a tvOS project using it and right now on a device the game cant seem to load a script for the plugin. Any ideas? see log below.

                              Code:
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:384][  0]LogWorld: UWorld::CleanupWorld for Untitled, bSessionEnded=true, bCleanupResources=true
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:384][  0]LogSlate: InvalidateAllWidgets triggered.  All widgets were invalidated
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:401][  0]LogAudioMixer: Display: No commands were queued while flushing the source manager.
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:404][  0]LogUObjectHash: Compacting FUObjectHashTables data took   1.96ms
                              
                              
                              **************************************************
                              
                              
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:413][  0]LogStreaming: Error: Couldn't find file for package /Script/DynamicDataTable requested by async loading code. NameToLoad: /Script/DynamicDataTable
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:414][  0]LogStreaming: Error: Found 1 dependent packages...
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:414][  0]LogStreaming: Error:   /Game/MAP_Main
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:479][  0]LogAIModule: Creating AISystem for world MAP_Main
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:479][  0]LogLoad: Game class is 'BP_GameMode_C'
                              
                              
                              *************************************************
                              
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:482][  0]LogWorld: Bringing World /Game/MAP_Main.MAP_Main up for play (max tick rate 0) at 2020.04.10-21.34.29
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:483][  0]LogWorld: Bringing up level for play took: 0.002089
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:487][  0]LogScript: Warning: Accessed None
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:487][  0]LogScript: Warning: Script call stack:
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:488][  0]LogLoad: Took 0.106260 seconds to LoadMap(/Game/MAP_Main)
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:495][  0]LogInit: Display: Initializing TCPConsoleListener.
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:495][  0]LogTemp: Warning: [UE4] Console Listener created!
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:499][  0]LogTemp: Warning: [UE4] TCP Listener created!
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:499][  0]LogIOS:  FSocketSubsystemIOS::InternalBSDSocketFactory
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:504][  0]LogRenderer: Reallocating scene render targets to support 1920x1080 Format 10 NumSamples 1 (Frame:1).
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:504][  0]LogContentStreaming: Texture pool size now 1000 MB
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:506][  0]LogSlate: InvalidateAllWidgets triggered.  All widgets were invalidated
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:550][  0]LogRenderer: Reallocating scene render targets to support 128x128 Format 10 NumSamples 1 (Frame:1).
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:850][  0]LogRenderer: Reallocating scene render targets to support 1920x1080 Format 10 NumSamples 1 (Frame:2).
                              Apr 10 21:34:29 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.34.29:897][  0]LogSlate: Slate font cache was flushed
                              Apr 10 21:36:59 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.36.59:735][493]LogIOS: New Remote controller inserted, assigned to playerIndex 0
                              Apr 10 21:37:00 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.37.00:726][523]LogTemp: Display: Calling Delegate
                              Apr 10 21:37:00 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.37.00:744][523]LogAudioMixerAudioUnit: Display: Suspending Audio
                              Apr 10 21:37:01 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.37.01:611][523]LogCore: Display: AppLifetime: Application will deactivate
                              Apr 10 21:37:01 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.37.01:653][527]LogTemp: Display: Task was completed before time.
                              Apr 10 21:37:01 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.37.01:653][527]LogTemp: Display: Done with entering background tasks time.
                              Apr 10 21:37:01 eDigital Globe[221] <Notice>: [UE4] [2020.04.11-01.37.01:936][527]LogCore: Display: AppLifetime: Application will enter background

                              Comment

                              Working...
                              X