UE4蓝图导致编辑器崩溃(抢救蓝图)

环境:

引擎版本: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++奔溃:代码编译不过,代码运行时有错误(空指针常见)

蓝图崩溃:引用了被修改的字段(目前能得出的结论是字段占用内存不一样会导致出问题,加字段没有问题,删字段(目标字段不能被引用,要及时刷新节点))

原文链接: https://www.cnblogs.com/zjr0/p/17042943.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    UE4蓝图导致编辑器崩溃(抢救蓝图)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/311327

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 上午11:57
下一篇 2023年2月16日 上午11:58

相关推荐