Very serious feature (Plan text based content data)

I copied some node and pasted to text editor & unminified, then i got:



Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_1193"
   FunctionReference=(MemberName="Jump",
    bSelfContext=True)
   NodePosX=720
   NodePosY=-224
   NodeGuid=0D5502754E59C0B2D4920984325328A6
   CustomProperties Pin (PinId=F843A2D34A2B5FB568B58EB4AD835FCD,
    PinName="execute",
    PinToolTip="
Exec",
    PinType.PinCategory="exec",
    PinType.PinSubCategory="",
    PinType.PinSubCategoryObject=None,
    PinType.PinSubCategoryMemberReference=(),
    PinType.PinValueType=(),
    PinType.ContainerType=None,
    PinType.bIsArray=False,
    PinType.bIsReference=False,
    PinType.bIsConst=False,
    PinType.bIsWeakPointer=False,
    LinkedTo=(K2Node_InputAction_60 48D2032843DFE6DE228F03BDF5329C9F,
),
    PersistentGuid=00000000000000000000000000000000,
    bHidden=False,
    bNotConnectable=False,
    bDefaultValueIsReadOnly=False,
    bDefaultValueIsIgnored=False,
    bAdvancedView=False,
    bOrphanedPin=False,
)
   CustomProperties Pin (PinId=8D9B3F7543F2CD7D1A6E079097E497B9,
    PinName="then",
    PinToolTip="
Exec",
    Direction="EGPD_Output",
    PinType.PinCategory="exec",
    PinType.PinSubCategory="",
    PinType.PinSubCategoryObject=None,
    PinType.PinSubCategoryMemberReference=(),
    PinType.PinValueType=(),
    PinType.ContainerType=None,
    PinType.bIsArray=False,
    PinType.bIsReference=False,
    PinType.bIsConst=False,
    PinType.bIsWeakPointer=False,
    PersistentGuid=00000000000000000000000000000000,
    bHidden=False,
    bNotConnectable=False,
    bDefaultValueIsReadOnly=False,
    bDefaultValueIsIgnored=False,
    bAdvancedView=False,
    bOrphanedPin=False,
)
   CustomProperties Pin (PinId=103D740C4C719EDCF4D6A090CD00642B,
    PinName="self",
    PinFriendlyName=NSLOCTEXT("K2Node","Target","Target"),
    PinToolTip="Target
Character Object Reference",
    PinType.PinCategory="object",
    PinType.PinSubCategory="",
    PinType.PinSubCategoryObject=Class'"/Script/Engine.Character"',
    PinType.PinSubCategoryMemberReference=(),
    PinType.PinValueType=(),
    PinType.ContainerType=None,
    PinType.bIsArray=False,
    PinType.bIsReference=False,
    PinType.bIsConst=False,
    PinType.bIsWeakPointer=False,
    PersistentGuid=00000000000000000000000000000000,
    bHidden=False,
    bNotConnectable=False,
    bDefaultValueIsReadOnly=False,
    bDefaultValueIsIgnored=False,
    bAdvancedView=False,
    bOrphanedPin=False,
)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_InputAction Name="K2Node_InputAction_60"
   InputActionName="Jump"
   bOverrideParentBinding=False
   NodePosX=480
   NodePosY=-208
   NodeGuid=85B233A843C15F3ACC54228E364AB796
   CustomProperties Pin (PinId=48D2032843DFE6DE228F03BDF5329C9F,
    PinName="Pressed",
    Direction="EGPD_Output",
    PinType.PinCategory="exec",
    PinType.PinSubCategory="",
    PinType.PinSubCategoryObject=None,
    PinType.PinSubCategoryMemberReference=(),
    PinType.PinValueType=(),
    PinType.ContainerType=None,
    PinType.bIsArray=False,
    PinType.bIsReference=False,
    PinType.bIsConst=False,
    PinType.bIsWeakPointer=False,
    LinkedTo=(K2Node_CallFunction_1193 F843A2D34A2B5FB568B58EB4AD835FCD,
),
    PersistentGuid=00000000000000000000000000000000,
    bHidden=False,
    bNotConnectable=False,
    bDefaultValueIsReadOnly=False,
    bDefaultValueIsIgnored=False,
    bAdvancedView=False,
    bOrphanedPin=False,
)
   CustomProperties Pin (PinId=E923AC324D959037CB7E5D891F543940,
    PinName="Released",
    Direction="EGPD_Output",
    PinType.PinCategory="exec",
    PinType.PinSubCategory="",
    PinType.PinSubCategoryObject=None,
    PinType.PinSubCategoryMemberReference=(),
    PinType.PinValueType=(),
    PinType.ContainerType=None,
    PinType.bIsArray=False,
    PinType.bIsReference=False,
    PinType.bIsConst=False,
    PinType.bIsWeakPointer=False,
    LinkedTo=(K2Node_CallFunction_9464 28E34A524B8051E782E333AE340F0F65,
),
    PersistentGuid=00000000000000000000000000000000,
    bHidden=False,
    bNotConnectable=False,
    bDefaultValueIsReadOnly=False,
    bDefaultValueIsIgnored=False,
    bAdvancedView=False,
    bOrphanedPin=False,
)
   CustomProperties Pin (PinId=FECDFF44412356652A8CD499F5469CA0,
    PinName="Key",
    Direction="EGPD_Output",
    PinType.PinCategory="struct",
    PinType.PinSubCategory="",
    PinType.PinSubCategoryObject=ScriptStruct'"/Script/InputCore.Key"',
    PinType.PinSubCategoryMemberReference=(),
    PinType.PinValueType=(),
    PinType.ContainerType=None,
    PinType.bIsArray=False,
    PinType.bIsReference=False,
    PinType.bIsConst=False,
    PinType.bIsWeakPointer=False,
    PersistentGuid=00000000000000000000000000000000,
    bHidden=False,
    bNotConnectable=False,
    bDefaultValueIsReadOnly=False,
    bDefaultValueIsIgnored=False,
    bAdvancedView=False,
    bOrphanedPin=False,
)
End Object
Begin Object Class=/Script/UnrealEd.EdGraphNode_Comment Name="K2Node_Comment_1"
   NodePosX=464
   NodePosY=-272
   NodeWidth=480
   NodeHeight=272
   NodeComment="Jump"
   NodeGuid=B5B1DB0D407B8CFA1BFC82A5E207C9F5
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_9464"
   FunctionReference=(MemberName="StopJumping",
    bSelfContext=True)
   NodePosX=720
   NodePosY=-112
   NodeGuid=87A062894FD2D141EDA0A6924E2F6EF2
   CustomProperties Pin (PinId=28E34A524B8051E782E333AE340F0F65,
    PinName="execute",
    PinToolTip="
Exec",
    PinType.PinCategory="exec",
    PinType.PinSubCategory="",
    PinType.PinSubCategoryObject=None,
    PinType.PinSubCategoryMemberReference=(),
    PinType.PinValueType=(),
    PinType.ContainerType=None,
    PinType.bIsArray=False,
    PinType.bIsReference=False,
    PinType.bIsConst=False,
    PinType.bIsWeakPointer=False,
    LinkedTo=(K2Node_InputAction_60 E923AC324D959037CB7E5D891F543940,
),
    PersistentGuid=00000000000000000000000000000000,
    bHidden=False,
    bNotConnectable=False,
    bDefaultValueIsReadOnly=False,
    bDefaultValueIsIgnored=False,
    bAdvancedView=False,
    bOrphanedPin=False,
)
   CustomProperties Pin (PinId=94DD177042C36EC780ECE58FF177CD47,
    PinName="then",
    PinToolTip="
Exec",
    Direction="EGPD_Output",
    PinType.PinCategory="exec",
    PinType.PinSubCategory="",
    PinType.PinSubCategoryObject=None,
    PinType.PinSubCategoryMemberReference=(),
    PinType.PinValueType=(),
    PinType.ContainerType=None,
    PinType.bIsArray=False,
    PinType.bIsReference=False,
    PinType.bIsConst=False,
    PinType.bIsWeakPointer=False,
    PersistentGuid=00000000000000000000000000000000,
    bHidden=False,
    bNotConnectable=False,
    bDefaultValueIsReadOnly=False,
    bDefaultValueIsIgnored=False,
    bAdvancedView=False,
    bOrphanedPin=False,
)
   CustomProperties Pin (PinId=E59C000141B335641FAD73B143C2DD33,
    PinName="self",
    PinFriendlyName=NSLOCTEXT("K2Node","Target","Target"),
    PinToolTip="Target
Character Object Reference",
    PinType.PinCategory="object",
    PinType.PinSubCategory="",
    PinType.PinSubCategoryObject=Class'"/Script/Engine.Character"',
    PinType.PinSubCategoryMemberReference=(),
    PinType.PinValueType=(),
    PinType.ContainerType=None,
    PinType.bIsArray=False,
    PinType.bIsReference=False,
    PinType.bIsConst=False,
    PinType.bIsWeakPointer=False,
    PersistentGuid=00000000000000000000000000000000,
    bHidden=False,
    bNotConnectable=False,
    bDefaultValueIsReadOnly=False,
    bDefaultValueIsIgnored=False,
    bAdvancedView=False,
    bOrphanedPin=False,
)
End Object


This is enough to use at IDE or Source Control, binary there is even no chance
Even we can’t do anything with it, the content data should stay readable before finnal product,
But actually we can do more thing than we expected, for example:

Some of these can directly done through Text (For Coders), (Designers & BluePrinters can do it using GUI, just like before): (Edited)

And you can do some tricky part eg: Replace names, Upgrade version, etc … (with out depending on the framework of editor)
And more …

If you tell us what exactly do you need to do with the data stored in uasset files “outside of the editor” we might be able to figure something out even without text assets :slight_smile:

Plan 1 (Based on Text content).

Serialized or not will be no difference to the User “inside of the editor”
So just don’t serialize content to Binary, keep it’s original state (Plan Text) (when open / editing / save, not after compile / cook / run),
And Let the Coders decide what they will do “outside of the eiditor”

Plan 2 (Based on Binary / Text content).

That’s require open a new topic
at least need to write BluePrint Plugin / Independent Unreal Tool For IDE (Visual Studio, KDevelop, QTCreator …) and Source Control (Git / SVN …)
Basically it’s all about let code to know about what inside binary
And we need talk about all the functions of this plugin / independent tool and it’s different version compatibility

I don’t want consider details of Plan 2, Because almost everything is ready for Plan 1
If Plan 1 done, may be we begin to think text based is hard to use, then we will want Plan 2 plugin for IDE, But at least we have Plan 1 can use

If we push Plan 2 now, we can only use Plan 2 (Based on Binary), and limited by more tool, more things need to change to text based content
But If we push Plan 1 now, we can use Plan 1 / Plan 1 + Plan 2 (Based on Text) latter if we want

C++ Use .h File to know Binary Library
How terrible if C++ Doesn’t even know what inside BluePrint without launching big Engine Editor
Text based BluePrintis is like .h / script / config / parse tree file, no matter what is, it premised to based on Text

BluePrint is not Content, that is (Visual) Code (Based on Text) !
Current Contents of UnrealEngine is not Content, They are actually Config files !
And The real Contents is human unreadable binary multimedia files, which is imported from other place (Not made by Engine Editor itself) !

So, Please just remove all serialization, And do like this:

And every issue you’ve listed can be solved without introducing text asset.
Minor issues of the visual tool (which could be quickly solved) should never encourage a major change in the basic data architecture.

Yes, Everything can be done through GUI, but that GUI Must be very powerfull and no bug, and compatible
If version changed too much, we must install older version of Engine, Or we don’t even know what inside Binary

If Text based we don’t need must depend on GUI or wait for GUI Change in some other case, eg:
Some of these can directly done through Text (For Coders), (Designers & BluePrinters can do it using GUI, just like before):

First, you can use commandlets for batch-processing content via command line. Second, it is inaccurate to say that we “don’t know what is inside asset files” as serialization code is quite straightforward and a lot can be done with it if necessary. After all, you can write your own importers and import your content from text format if you absolutely need it. So there is nothing really that a programmer cannot handle :slight_smile:

90% of this discussion is superfluous given that as stated above, Epic said they’re working on some sort of text-based solution for Blueprints.

Could you give me an official link ?

Epic Devs are experimenting with text assets:

52:53 https://www.youtube.com/watch?v=UwVoYfgP6ZY

For me it is very important because sometimes blueprint gets corrupted because it serialized incorrect data and there is no way how to fix them, only recreate blueprint. Like setting component to EditAnywhere, set it to null in editor and save blueprint or you can incorrectly add delegate in constructor and binding will get serialized, so getting rid of this additional delegate binding is difficult. And many other weird problems, in same cases I exactly know the cause, I just can’t fix it.

:smiley: Great !
I’m also really need text assets too
This video gives me confidence to stick with Unreal Engine

I think this post should take a break, thank you everyone