Unreal Engine 4.18.3蓝图中多子类对象的游戏保存方案咨询
嘿,我刚好在UE4里踩过类似的继承类存档坑,给你几个在4.18.3蓝图里完全可行的方案,避开你说的JSON和直接序列化的麻烦:
方案一:自定义结构体+SaveGame类(最稳妥)
这是蓝图里处理多子类存档的标准思路,核心是把每个对象的类型标识和变量都打包进结构体,再存到SaveGame的数组里:
第一步:创建存档用的结构体和类型枚举
先做一个E_GameObjectType枚举,把你所有GameObject子类(比如Player、Enemy、CollectibleItem等)都加进去。然后创建一个F_GameObjectSaveData结构体,里面至少包含:- 枚举变量
ObjectType(标记当前是哪个子类) - 基类GameObject的通用变量(比如位置、ID、生命值这些)
要是子类有专属变量,你可以给结构体加“可选变量”(或者用结构体继承,4.18支持蓝图结构体继承:基类结构体存通用数据,每个子类对应一个派生结构体存专属数据)。
- 枚举变量
第二步:给GameObject基类加存档接口
在基类蓝图里创建一个可重写的函数GetSaveData(),返回F_GameObjectSaveData(或者基类结构体)。然后每个子类重写这个函数,把自己的类型枚举、通用变量和专属变量都填充到结构体里。第三步:创建自定义SaveGame类
新建一个继承自SaveGame的蓝图类,里面加一个TArray<F_GameObjectSaveData>类型的变量,记得在细节面板里勾选Save Game选项,这样这个数组会被正确序列化。第四步:实现保存和加载逻辑
- 保存:用
Get All Actors of Class节点获取所有GameObject子类对象,遍历每个对象调用GetSaveData(),把结构体添加到SaveGame的数组里,最后用Save Game to Slot节点存盘。 - 加载:用
Load Game from Slot拿到SaveGame实例,遍历数组里的每个结构体:根据ObjectType枚举创建对应的子类对象(用Spawn Actor from Class或者New Object),然后把结构体里的变量逐个赋值给新对象。
- 保存:用
方案二:利用UE原生对象序列化(适合复杂对象)
如果你不想写太多结构体代码,可以试试UE的原生序列化机制,前提是你的GameObject类设置正确:
第一步:配置可序列化的类和变量
确保你的GameObject基类和所有子类都是UObject派生类(比如Actor或者ActorComponent),然后在类设置里勾选Serializable。所有需要保存的变量,在蓝图细节面板里勾选Save Game选项,这样序列化时会自动包含这些变量。第二步:在SaveGame里存对象数组
创建自定义SaveGame类,里面加一个TArray<UGameObject*>类型的变量,同样勾选Save Game。不过要注意:SaveGame里的对象是“瞬态”的,加载时不会自动实例化场景对象,所以你需要手动处理:第三步:保存和加载
- 保存:把所有GameObject对象添加到SaveGame的数组里,调用存盘节点即可。
- 加载:拿到SaveGame实例后,遍历数组里的每个对象,用
Spawn Actor from Class创建对应子类的实例,然后用Copy Object节点把存档里的对象变量复制到新实例上。
避坑提醒
- 你之前尝试的JSON确实在UE4.18蓝图里没有原生支持,第三方插件可能存在兼容性问题,不推荐在正式项目里用。
- 直接序列化对象时,要注意对象的引用关系,比如如果你的GameObject引用了其他场景对象,可能会导致存档体积过大或者加载出错,这时候结构体方案会更可控。
- 不管用哪种方案,新增子类后都要同步更新枚举、结构体或者序列化设置,避免漏存数据。
内容的提问来源于stack exchange,提问作者Espeon




