You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:18:25