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

Unity调用需UIViewController的iOS框架方法的实现方案咨询

Unity调用iOS框架present方法的解决方案

核心思路

Unity本身不直接提供UIViewController实例,但Unity在iOS平台运行时,其界面依附于一个原生的根UIViewController。我们需要通过iOS原生桥接层获取这个根控制器,再传递给你的框架方法完成调用。


步骤1:编写iOS原生桥接层

创建一个中间类,负责获取Unity的根ViewController并调用你的框架方法,同时处理异步回调。

方式一:Objective-C桥接(兼容性更好)

创建UnityFrameworkBridge.m文件,放入Unity的Assets/Plugins/iOS目录:

#import <UIKit/UIKit.h>
#import <UnityFramework/UnityFramework.h>
// 导入你的Swift框架自动生成的桥接头文件,格式为「YourFrameworkName-Swift.h」

@interface UnityFrameworkBridge : NSObject
+ (void)presentFrameworkWithKey:(NSString *)key gameObjectName:(const char*)gameObjName callbackMethod:(const char*)methodName;
@end

@implementation UnityFrameworkBridge

+ (void)presentFrameworkWithKey:(NSString *)key gameObjectName:(const char*)gameObjName callbackMethod:(const char*)methodName {
    // 获取Unity根ViewController(适配不同Unity版本)
    UIViewController *rootVC = nil;
    UnityFramework *framework = [UnityFramework sharedFramework];
    if (framework && framework.appController) {
        rootVC = framework.appController.rootViewController;
    } else {
        rootVC = [UIApplication sharedApplication].keyWindow.rootViewController;
    }

    if (!rootVC) {
        UnitySendMessage(gameObjName, methodName, "false|Failed to get root view controller");
        return;
    }

    // 调用你的框架方法
    [YourFrameworkClass presentFromParentController:rootVC key:key completionHandler:^(BOOL success, NSString *message) {
        NSString *result = [NSString stringWithFormat:@"%d|%@", success, message];
        UnitySendMessage(gameObjName, methodName, result.UTF8String);
    }];
}

@end

方式二:Swift桥接

创建UnityFrameworkBridge.swift文件,放入Assets/Plugins/iOS:

import UIKit
import UnityFramework
import YourFrameworkName

@objc public class UnityFrameworkBridge: NSObject {
    @objc public static func presentFramework(withKey key: String, gameObjectName: String, callbackMethod: String) {
        // 获取Unity根ViewController
        guard let rootVC = UnityFramework.shared()?.appController?.rootViewController ?? UIApplication.shared.keyWindow?.rootViewController else {
            UnitySendMessage(gameObjectName, callbackMethod, "false|Failed to get root view controller")
            return
        }

        // 调用框架方法
        YourFrameworkClass.present(from: rootVC, key: key) { success, message in
            let result = "\(success)|\(message)"
            UnitySendMessage(gameObjectName, callbackMethod, result)
        }
    }
}

注意:使用Swift时,Unity导出Xcode项目后,需在Build Settings中配置正确的Swift Language Version,并确保框架已正确嵌入。


步骤2:Unity C#端绑定与调用

在Unity中编写C#脚本,绑定原生桥接方法,处理按钮点击和回调:

using UnityEngine;
using System.Runtime.InteropServices;

public class FrameworkCaller : MonoBehaviour
{
    // 绑定原生桥接方法
    [DllImport("__Internal")]
    private static extern void presentFrameworkWithKey(string key, string gameObjectName, string callbackMethod);

    // 按钮点击触发的公开方法
    public void OnPresentButtonTap()
    {
        // 传入业务key、当前GameObject名称、回调方法名
        presentFrameworkWithKey("your_business_key", gameObject.name, "OnFrameworkCallback");
    }

    // 接收原生回调的公开方法
    public void OnFrameworkCallback(string result)
    {
        // 解析回调结果(格式:"success|message")
        string[] parts = result.Split('|');
        bool isSuccess = bool.Parse(parts[0]);
        string message = parts[1];

        // 处理结果,比如更新UI或打印日志
        Debug.Log($"Framework call result: success={isSuccess}, message={message}");
    }
}

将此脚本挂载到Unity按钮所在的GameObject上,给按钮的OnClick事件绑定OnPresentButtonTap方法。


步骤3:Unity导出与Xcode配置

  1. 将你的iOS框架(.framework文件)和桥接文件放入Unity的Assets/Plugins/iOS目录。
  2. 导出Xcode项目后,在General标签的Frameworks, Libraries, and Embedded Content中,将你的框架设置为Embed & Sign。
  3. 若使用Swift桥接,确保Xcode项目的Build Settings中Always Embed Swift Standard Libraries设为Yes。

内容的提问来源于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 14:54:30