如何针对不同商店构建禁用Unity IAP?初始化代码仍报错
一、彻底禁用Unity IAP(针对OneStore构建)
仅通过Services面板禁用Unity IAP无法完全隔离相关代码,需要从代码、包管理、构建配置三个层面处理:
用预编译指令包裹所有Unity IAP相关代码
你的GoogleIAPService必然依赖Unity IAP的命名空间(如UnityEngine.Purchasing),必须把这类代码全部用#if GOOGLE_MARKET包裹,确保OneStore构建时完全跳过编译:#if GOOGLE_MARKET using UnityEngine.Purchasing; public class GoogleIAPService : IIAPService { // Unity IAP的初始化、购买逻辑等代码 void Start() { // Unity IAP初始化逻辑 } } #endif条件管理Unity IAP包
打开Window > Package Manager找到Unity In-App Purchasing包:- 若分开构建Google Play和OneStore,构建OneStore时直接删除该包,构建Google Play时重新安装;
- 嫌手动切换麻烦的话,Unity 2021+支持包的条件导入,修改
Packages/manifest.json:
这样仅当定义{ "dependencies": { "com.unity.purchasing": "4.8.0", ... }, "conditionalDependencies": { "com.unity.purchasing": ["GOOGLE_MARKET"] } }GOOGLE_MARKET宏时,才会加载Unity IAP包。
清理Player Settings中的IAP配置
打开Edit > Project Settings > Player > Android > Publish Settings,确保Enable Unity IAP未勾选;同时确认Services > In-App Purchasing已彻底禁用,重启Unity保证设置生效。
二、ONESTORE_MARKET构建中Unity内购代码仍执行的原因及修复
你的宏分支逻辑本身没问题,问题大概率出在以下几点:
宏定义设置错误
打开Edit > Project Settings > Player > Other Settings > Scripting Define Symbols:- 针对Google Play构建,仅添加
GOOGLE_MARKET; - 针对OneStore构建,仅添加
ONESTORE_MARKET,绝对不能同时添加两个宏,否则代码会优先匹配第一个分支(GOOGLE_MARKET)。
建议用Unity的Build Variants给每个构建变体单独配置宏,避免手动切换出错。
- 针对Google Play构建,仅添加
存在未被宏包裹的Unity IAP代码
检查项目所有脚本,有没有其他地方直接引用了Unity IAP的API且未用#if GOOGLE_MARKET包裹。比如某些工具类、全局管理器里的初始化代码,即使你的IAPManager没实例化GoogleIAPService,这些代码也会执行并报错。场景中存在未禁用的Unity IAP相关组件
排查所有场景,有没有直接挂载GoogleIAPService或Unity IAP自带组件的GameObject。这类组件会在场景加载时自动初始化,要么用宏控制组件的启用状态,要么仅在Google Play构建时保留这些组件。
新手额外提示
- 切换构建目标后,点击
File > Build Settings > Refresh确保宏定义和包配置同步; - 构建前执行
File > Build Settings > Clean Build清理缓存,避免旧编译残留; - 测试时可添加宏定义打印,确认分支是否正确:
void Start() { #if GOOGLE_MARKET Debug.Log("当前构建:GOOGLE_MARKET"); #elif ONESTORE_MARKET Debug.Log("当前构建:ONESTORE_MARKET"); #else Debug.Log("当前构建:默认"); #endif // 原有分支逻辑 }
内容的提问来源于stack exchange,提问作者Lucas

