如何等待Initialize()执行完成后再执行后续代码?
别再用固定等待时间了,这完全不靠谱。Unity IAP的初始化是异步操作,得靠官方提供的回调来精准判断完成时机,给你两种靠谱方案:
方案1:利用初始化完成回调直接执行逻辑
你的类已经实现了IStoreListener接口(毕竟调用UnityPurchasing.Initialize(this, builder)时传了this),只需要在OnInitialized回调里触发后续逻辑就行:
// 加个标记,方便其他地方判断初始化状态 private bool _isInitialized = false; void Initialize() { var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance()); builder.Configure<IGooglePlayConfiguration>().SetDeferredPurchaseListener(OnDeferredPurchase); builder.Configure<IGooglePlayConfiguration>().SetQueryProductDetailsFailedListener(MyAction); builder.AddProduct(productId, ProductType.Subscription); UnityPurchasing.Initialize(this, builder); }; // IStoreListener要求实现的初始化完成回调 public void OnInitialized(IStoreController controller, IExtensionProvider extensions) { _isInitialized = true; // 初始化完成立刻执行后续逻辑 dosomeThing(); } // 必须实现初始化失败的回调,否则会报错 public void OnInitializeFailed(InitializationFailureReason error) { Debug.LogError($"IAP初始化失败:{error}"); // 这里可以加失败后的处理逻辑,比如弹窗提示用户 }
方案2:用协程等待初始化完成(适合特定时机触发的场景)
如果不想在回调里直接执行,而是要在某个方法里主动等待初始化完成再执行,就用协程配合标记变量:
private bool _isInitialized = false; void waitInit() { Initialize(); // 启动协程等待初始化完成 StartCoroutine(WaitForInitThenExecute()); } IEnumerator WaitForInitThenExecute() { // 等待标记变为true,完全不用固定时间 yield return new WaitUntil(() => _isInitialized); dosomeThing(); } // 同样要在回调里更新标记 public void OnInitialized(IStoreController controller, IExtensionProvider extensions) { _isInitialized = true; } public void OnInitializeFailed(InitializationFailureReason error) { Debug.LogError($"IAP初始化失败:{error}"); }
为什么原来的WaitForSeconds不行?
Unity IAP的初始化时间受网络状态、设备性能影响,可能1秒不够(比如网络卡顿),导致后续逻辑执行时初始化还没完成;也可能浪费时间(比如0.2秒就完成了,还要空等0.8秒),只有靠回调或状态标记的方式,才能精准、可靠地等待初始化完成。
内容的提问来源于stack exchange,提问作者stingalimian galimian
相关产品推荐
相关产品推荐

