Unity移动端打包出现CS0246错误:找不到InitializeOnLoadMethod
解决Unity打包手机时InitializeOnLoadMethod找不到的错误
错误原因
[InitializeOnLoadMethod]是Unity编辑器专用的属性,属于UnityEditor命名空间——这类代码只在Unity编辑器环境下生效,打包到手机等目标平台时,Unity会自动排除Editor相关代码,导致编译时找不到这个属性。而Visual Studio里会编译所有代码(包括Editor代码),所以编辑器里运行正常,打包就报错。
另外,你手动修改VS的.NET版本是错误操作,Unity项目的.NET版本要和Unity编辑器的设置保持一致,乱改只会引发更多兼容性问题。
解决步骤
1. 将Editor专用代码移到Editor文件夹
Unity默认会把Editor文件夹下的所有代码排除在打包之外,只在编辑器中编译运行:
- 在项目根目录新建一个名为
Editor的文件夹(如果没有的话)。 - 把包含
[InitializeOnLoadMethod]的逻辑拆分出来,放到Editor文件夹下的单独脚本里。比如:
// 放在Editor文件夹下的PropertyInitializer.cs using System.Linq; using System.Reflection; using UnityEditor; public static class PropertyInitializer { [InitializeOnLoadMethod] private static void OnInitialized() { var propTypes = Assembly.GetAssembly(typeof(Property)).GetTypes().Where(myType => myType.IsClass && !myType.IsAbstract && myType.IsSubclassOf(typeof(Property))); EntityBuild.PROP_NAMES = propTypes.Select(type => type.ToString()).ToList(); } }
- 原来的
ExecuteOnRefresh类如果没有其他运行时需要的逻辑,可以直接删除;如果有ExecuteInEditMode相关的运行时逻辑,保留不需要Editor属性的部分即可(因为继承MonoBehaviour的类属于运行时代码,不能放在Editor文件夹)。
2. 恢复.NET版本设置
- 打开Unity编辑器,依次点击
Edit > Project Settings > Player > Other Settings > Configuration。 - 把
Api Compatibility Level改回.NET Framework 4.7.1,VS里的解决方案版本会自动和Unity同步,不需要手动修改VS的设置。
3. 验证修复
- 先清理项目:点击Unity顶部菜单
Assets > Reimport All,再重启Unity和VS。 - 尝试重新打包,应该不会再出现
InitializeOnLoadMethod找不到的错误。
内容的提问来源于stack exchange,提问作者Stefan Carpeliuc
相关产品推荐
相关产品推荐

