unity报错"Could not produce class with id"
Unity打的Android包报错,给出的提示是
This could be caused by a class being stripped from the build even though it is needed. Try disabling 'Strip Engine Code' in Player Settings.
建议禁用剔除引擎代码
如果不想禁用,还有一个方案,就是告诉Unity不要剔除指定的类
- 到 https://docs.unity3d.com/Manual/ClassIDReference.html 找到报错提示中id对应的类,例如(id 258)对应的是LightProbes
- 在Assets目录添加文件link.xml
-
<linker> <assembly fullname="UnityEngine"> <type fullname="UnityEngine.LightProbes" preserve="all"/> </assembly> </linker>
填入上述内容
通常情况下,我们并不明确知道哪些代码会被剔除,总不能每次都等到报错再去处理。如果能够提前知道哪些类被剔除,就可以在link.xml中提前处理。
使用il2cpp模式打包,完成后在项目的临时目录中找到Unity注册类型的cpp文件,例如:\Temp\StagingArea\strip\armeabi-v7a\UnityClassRegistration.cpp
在文件末尾可以看到如下代码
void RegisterAllClasses() { void RegisterBuiltinTypes(); RegisterBuiltinTypes(); //Total: 125 non stripped classes //0. NavMeshAgent RegisterUnityClass<NavMeshAgent>("AI");
从注释就可以看出这个函数注册了unity不剔除的类型
在注册函数之前可以看到有很多类的声明
class RenderSettings; template <> void RegisterUnityClass<RenderSettings>(const char*); class NativeObjectType;
如果只声明了类,例如NativeObjectType,那么这个类就是会被剔除的,在注册函数中也找不到对应的注册逻辑。
如果类后面还声明了注册函数,那么这个类就不会被剔除。