博兔

导航

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不要剔除指定的类

  1. 到 https://docs.unity3d.com/Manual/ClassIDReference.html 找到报错提示中id对应的类,例如(id 258)对应的是LightProbes
  2. 在Assets目录添加文件link.xml
  3. <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,那么这个类就是会被剔除的,在注册函数中也找不到对应的注册逻辑。

如果类后面还声明了注册函数,那么这个类就不会被剔除。

 

posted on 2021-01-28 14:06  博兔  阅读(1135)  评论(0编辑  收藏  举报