环境:
引擎版本:ue4.27.2
IDE:JetBrains Rider 2022.2.3+vs2022
蓝图目标:用户控件蓝图
起因
修改了结构体的字段的类型从uint8->int,就为了省那三个字节的内存,后面发现类型转化上需要转几次,有那省的三字节内存,还不如节约类型转换的性能,然后就修改为int类型,典型的丢西瓜捡芝麻。
结果
蓝图引用了C++的哪个被修改的结构体,并对这个结构体进行操作,编辑器热编译不能让蓝图的字段类型刷新,我就重启了ue4,然后就不能点击哪个蓝图了,点击了就崩溃。
抢救过程
1.首先开启调试模式,强开蓝图。点击蓝图后脚本编辑器会跳到引擎内部去,这个时候就不要管跳那去了,直接一直点继续,直到没有出现继续为止(十次左右)。
2.这个时候会出现一个弹窗,告诉你蓝图里有变量有变量有问题问你要不要删除,这个时候点不删除,进入蓝图。
3.新建一个蓝图,把奔溃蓝图的ui全复制过去
4.蓝图连线部分先拷贝到一个文件夹里,拷贝蓝图的主要连线和方法就可以了,我这边变量就有问题所以不复制。有多个蓝图都使用了哪个结构体,所以我这边用同样的方法处理了几个蓝图。蓝图的所有节点看起来是一个对象被序列化的产物(以下是我随便拷贝的两小段),每一个小段都有“Object Class=/Script/Blueprintxxx”,从这里看出来是对象序列化的产物。
Begin Object Class=/Script/BlueprintGraph.K2Node_Event Name="K2Node_Event_0"
EventReference=(MemberParent=Class'"/Script/UMG.UserWidget"',MemberName="PreConstruct")
bOverrideFunction=True
NodePosX=880
NodePosY=80
EnabledState=Disabled
bCommentBubblePinned=True
bCommentBubbleVisible=True
NodeComment="此节点被禁用,将不会被调用。\n从引脚连出引线来编译功能。"
NodeGuid=6753599544B7CA35D56B54AADCA1A5BA
CustomProperties Pin (PinId=B19CDCEE460DC57AC4F552BEB81D7CEC,PinName="OutputDelegate",Direction="EGPD_Output",PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent=Class'"/Script/UMG.UserWidget"',MemberName="PreConstruct"),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=018B00464B446ADAA528E3A79CE7BFB2,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=1C64CD024C5EC9AD6FCD9AB1580BBCCE,PinName="IsDesignTime",PinToolTip="Is Design Time\n布尔",Direction="EGPD_Output",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,DefaultValue="false",AutogeneratedDefaultValue="false",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_Event Name="K2Node_Event_1"
EventReference=(MemberParent=Class'"/Script/UMG.UserWidget"',MemberName="Construct")
bOverrideFunction=True
NodePosX=1024
NodePosY=656
bCommentBubblePinned=True
NodeGuid=A4FE884E4A8AA8F2CA5B8AA37D155EB4
CustomProperties Pin (PinId=9AE76AF44ED292266CD717AB0AEB52E7,PinName="OutputDelegate",Direction="EGPD_Output",PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent=Class'"/Script/UMG.UserWidget"',MemberName="Construct"),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=EE00014B4994BCAF1414668C31A17DB6,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,LinkedTo=(K2Node_CallFunction_0 156EBA694C869ED7294CEAAEAA7DE716,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
5.关闭调试之前,保存创建的替代蓝图,新建的蓝图只有ui样式,没有连线是可以编译的,然后删掉有问题的蓝图。
6.然后开启非调试编辑器,在新建一个蓝图把刚刚复制的蓝图全拷贝过去,大部分节点是可以正常显示的,这个时候就一点一点的拷贝进替代蓝图里,不能莽的全拷贝进替代蓝图,会告诉你有变量有问题(引用了有问题的变量),会导致编译不了。
7.这个时候就可以使用修改过后的类型来修复蓝图了,只是这个修复的代价有点高
按照这个流程就可以完美修复了,第一次遇到蓝图导致奔溃的问题,刚开始修复蓝图还删了一些节点,想强行续命,结果徒劳罢了,太多节点有问题了,走了一点小弯道。
遇到这种问题,首先不能关闭编辑器,关了就挂,需要想办法让蓝图识别出你修改的字段类型,只能后面遇到了在琢磨了,最好是别遇到,浪费时间。
C++奔溃:代码编译不过,代码运行时有错误(空指针常见)
蓝图崩溃:引用了被修改的字段(目前能得出的结论是字段占用内存不一样会导致出问题,加字段没有问题,删字段(目标字段不能被引用,要及时刷新节点))
标签:None,False,Script,蓝图,编辑器,UE4,PinType,Class From: https://www.cnblogs.com/zjr0/p/17042943.html