Unity UWP构建中[SerializeField]引发序列化布局错误的解决方法
错误信息
A scripted object probably BlankScene has a different serialization layout when loading (Read 32 bytes instead of 80 bytes) Did you #if UNITY_EDITOR a section of your serialized properties in any of your scripts
场景与脚本说明
该场景极为简单,仅包含一个Directional Light、一个Main Camera,以及挂载了如下BlankScene组件的空GameObject:
using UnityEngine; public class BlankScene : MonoBehaviour { [SerializeField] private GameObject mainCameraObj; [SerializeField] private GameObject directionalLightObj; [SerializeField] private Camera mainCamera; [SerializeField] private Light directionalLight; }
相关情况
- 移除
[SerializeField]后错误消失,但希望这些字段在编辑器中保持序列化; - 脚本中无
#if UNITY_EDITOR编辑器专属代码; - 场景中仅存在此组件。
已尝试的方法
- 将字段改为public;
- 将字段改为不带
[SerializeField]的private;
但只要使用[SerializeField],问题就会持续。
问题
是否有人成功在Unity UWP构建脚本中使用[SerializeField]且不触发该错误?如何在编辑器保留字段序列化的同时避免UWP构建出问题?
可行解决方案
显式标记可序列化并统一布局
在脚本类上方添加[Serializable]特性(MonoBehaviour默认支持序列化,但显式标记可消除潜在的布局识别问题),Unity 2020.2+版本还可配合[SerializeLayout]强制统一序列化规则:using UnityEngine; [Serializable] public class BlankScene : MonoBehaviour { [SerializeField] private GameObject mainCameraObj; [SerializeField] private GameObject directionalLightObj; [SerializeField] private Camera mainCamera; [SerializeField] private Light directionalLight; }清理Unity序列化缓存
- 删除项目根目录下的
Library文件夹,让Unity重新生成所有序列化数据; - 执行
Assets -> Clear Cache清理资源缓存,再通过Assets -> Reimport All重新导入所有资源,确保编辑器与构建端的序列化数据一致。
- 删除项目根目录下的
匹配UWP构建的.NET版本
在Unity的Player Settings -> UWP -> Configuration中,将.NET版本设置为.NET Standard 2.0,确保编辑器与UWP运行时的序列化逻辑环境一致,避免因版本差异导致布局不匹配。优化序列化字段,减少冗余
脚本中同时序列化GameObject和对应组件的引用属于冗余设计,可改为仅序列化组件,通过组件获取GameObject,减少序列化字段数量:using UnityEngine; [Serializable] public class BlankScene : MonoBehaviour { [SerializeField] private Camera mainCamera; [SerializeField] private Light directionalLight; // 需要时通过组件获取对应GameObject private GameObject MainCameraObj => mainCamera?.gameObject; private GameObject DirectionalLightObj => directionalLight?.gameObject; }重新生成Visual Studio项目
构建UWP前,勾选Player Settings -> UWP -> Build -> Generate Visual Studio project,删除旧的VS项目文件夹,让Unity重新生成干净的项目文件,避免旧序列化残留干扰。
内容的提问来源于stack exchange,提问作者Gabriel Alabi

