Unity3D中命名空间内的ScriptableObject创建后脚本丢失如何解决?
解决方案
- 首先核对脚本文件名和类名完全一致,大小写必须严格匹配:比如
SO_UI_SizePreset类对应的脚本文件必须命名为SO_UI_SizePreset.cs,Unity的脚本绑定逻辑强依赖文件名和类名的匹配,差一个字符都会导致绑定失败。 - 确认ScriptableObject脚本没有放在
Editor目录下:Editor目录下的代码仅在编辑器环境加载,运行时无法识别,创建出来的资产也会丢失脚本引用,把这些SO脚本移到普通的非Editor目录即可。 - 检查类中引用的自定义类型是否可序列化:你代码里用到的
UnitType如果是自定义枚举或者类,需要确保它加了[Serializable]属性,且没有放在Editor目录下,字段序列化失败也会导致SO资产加载异常。 - 如果你是从无命名空间的结构重构到带命名空间的结构,可以给每个SO类加上
[UnityEngine.Scripting.APIUpdater.MovedFrom]属性,显式告诉Unity序列化时的类名映射:
namespace BBMM.UI.ScriptableObjects { [MovedFrom("SO_UI_SizePreset")] // 括号内填重构前的类完整名称 [CreateAssetMenu(fileName = "New Size Preset", menuName = "BBMM/Size Preset")] public class SO_UI_SizePreset : ScriptableObject { public string presetName; public Vector2 realSize; public UnitType unit; } }
- 以上操作完成后,在Unity编辑器顶部菜单选择
Assets > Open C# Project重新生成解决方案,等IDE全量编译完成后返回Unity,等待脚本重新导入完成再试创建SO资产。 - 如果以上操作都无效,可以关闭Unity,删除项目根目录下的
Library和Temp文件夹,重新打开项目等待资源全量导入后再测试,排除缓存导致的匹配异常。
内容的提问来源于stack exchange,提问作者nankink
相关产品推荐
相关产品推荐

