Unity&C#新手求教:iOS Swift包装器代码优化及内联回调实现
Unity iOS 包装器代码优化与内联回调方案
一、代码优化要点
- 你的
ButtonHandler.js实际是C#代码(带有[MonoPInvokeCallback]专属属性),建议将文件名改为ButtonHandler.cs,避免语言类型混淆。 - 保持平台编译指令的简洁性,无需额外封装,但若后续有多处原生调用,可单独提取平台判断逻辑为私有方法。
- 回调方法添加明确命名和注释,提升代码可读性与维护性。
二、内联回调的可行性说明
Unity与iOS原生交互时,[MonoPInvokeCallback]要求回调必须是静态方法——原生层需要固定的函数地址来触发回调,因此无法直接使用匿名内联函数。不过可以通过字典映射的方式,间接实现类似内联的逻辑聚合效果,代价是需要修改Swift包装器的回调逻辑。
三、无侵入优化后的代码示例
Native.cs(保持原逻辑即可)
[DllImport("__Internal")] extern static public void SDK_getOffers(Action<bool, string> completionHandler);
ButtonHandler.cs(优化后)
using UnityEngine; using System; using AOT; public class ButtonHandler : MonoBehaviour { public void ButtonGetOffersTapped() { #if UNITY_IOS && !UNITY_EDITOR Debug.Log("✅ button get offers tapped"); SDK_getOffers(HandleGetOffersResult); #endif } [MonoPInvokeCallback(typeof(Action<bool, string>))] private static void HandleGetOffersResult(bool status, string message) { Debug.Log($"✅ status is: {status}\n✅ message is: {message}"); // 这里添加你的回调业务逻辑 } }
四、模拟内联回调的实现技巧
如果希望回调逻辑与调用代码更贴近,可通过静态字典关联回调ID,将匿名函数暂存后中转触发:
using UnityEngine; using System; using System.Collections.Generic; using AOT; public class ButtonHandler : MonoBehaviour { private static int _callbackIdCounter = 0; private static Dictionary<int, Action<bool, string>> _callbackCache = new Dictionary<int, Action<bool, string>>(); public void ButtonGetOffersTapped() { #if UNITY_IOS && !UNITY_EDITOR Debug.Log("✅ button get offers tapped"); int callbackId = _callbackIdCounter++; // 在这里直接定义内联逻辑 Action<bool, string> inlineLogic = (status, message) => { Debug.Log($"✅ status is: {status}\n✅ message is: {message}"); _callbackCache.Remove(callbackId); // 执行后清理,避免内存泄漏 }; _callbackCache.Add(callbackId, inlineLogic); // 注意:需要修改Swift包装器,将原SDK_getOffers改为接收回调ID的方法 // 例如SDK_getOffersWithCallbackId(callbackId),原生回调时调用Unity的OnGetOffersCallback方法 #endif } // 供原生Swift调用的中转回调方法 [MonoPInvokeCallback(typeof(Action<int, bool, string>))] private static void OnGetOffersCallback(int callbackId, bool status, string message) { if (_callbackCache.TryGetValue(callbackId, out var callback)) { callback.Invoke(status, message); } } }
此方案需同步修改Swift包装器的回调逻辑,若不想改动原生代码,建议优先使用静态回调的优化方案。
内容的提问来源于stack exchange,提问作者Matrix
相关产品推荐
相关产品推荐

