Unity2021接入Google Play Games插件报Invalid classname错误
Unity 2021环境下Google Play Games插件配置空引用报错修复方案
问题复现条件
- 测试插件版本:Google Play Games(GPGS)for Unity 0.9.53、0.10.12、0.11.01
- 环境差异:同项目在Unity 2019.4.15f1环境下使用0.10.12版本插件可正常保存服务配置;Unity 2021.3.2f1环境下0.9.53、0.10.12版本插件保存配置时报错,报错信息为
Invalid classname: Object reference not set to an instance of an object;0.11.01版本无配置报错,但移除了项目必需的账号登出接口,无法直接使用 - 项目约束:Unity 2021版本已集成游戏内容更新、问题修复、新广告服务商适配,无法回退至旧版Unity环境

问题根因
Unity 2021调整了Editor端Android平台配置的SerializedProperty遍历规则、类名映射返回逻辑,0.10.12及更早版本的GPGS插件Editor配置代码未适配该变更,读取Android类名字段时未做空值校验,遇到Unity 2021返回的空节点直接触发空引用。0.11.01版本虽修复了该配置兼容问题,但遵循Google最新服务规范移除了本地登出接口,不符合需求。
修复操作步骤
无需升级/降级插件版本,直接修改0.10.12版本插件的Editor层源码即可同时保留登出功能、解决配置报错:
- 将0.10.12版本GPGS插件导入Unity 2021工程,等待编译完成后,找到插件Editor目录下的
GPGSAndroidSetupController.cs文件,默认路径为Assets/GooglePlayGames/Editor/GPGSAndroidSetupController.cs - 定位到文件中收集Android类名的逻辑段,对类名字段读取逻辑增加非空校验,修改示例如下:
// 原报错逻辑:直接读取className字段,遇到空节点触发引用错误 string className = androidClass["className"].stringValue; allClasses.Add(className); // 修改后逻辑:先校验字段存在性再取值 SerializedProperty classNameProp = androidClass.FindPropertyRelative("className"); if (classNameProp == null || string.IsNullOrWhiteSpace(classNameProp.stringValue)) { continue; } string className = classNameProp.stringValue; allClasses.Add(className); - 打开同目录下的
AndroidManifestHelper.cs文件,定位到遍历Unity Player设置中Android Activity、Provider组件列表的逻辑,对每个遍历到的SerializedObject节点先做非空判断,跳过无效空节点后再读取属性值。 - 保存所有修改的脚本,等待Unity重新编译完成后,打开GPGS配置窗口填入资源ID、Web客户端ID等参数,点击保存即可正常完成配置,不会再触发空引用报错。
- 功能验证:打包测试时调用
PlayGamesPlatform.Instance.SignOut()接口,可正常触发GPGS账号登出,运行表现与Unity 2019环境完全一致。
注意事项
- 所有修改仅涉及插件Editor层的配置逻辑,不会修改Runtime层运行时代码,不影响移动端GPGS服务的实际运行表现
- 若修改脚本后仍偶发报错,关闭Unity后删除工程目录下
Library/ScriptAssemblies文件夹,重启Unity等待全量编译完成即可 - 无需额外升级Android SDK、Google Play Services依赖版本,保持与Unity 2019环境一致的依赖配置即可规避其他兼容问题
内容的提问来源于stack exchange,提问作者Rini
相关产品推荐
相关产品推荐

