找回密码
 立即注册
查看: 291|回复: 0

Unity和OC交互

[复制链接]
发表于 2023-2-28 13:08 | 显示全部楼层 |阅读模式
步骤一:


将.m文件修改为.mm文件,并在其中实现需要调用的方法,然后通过C代码调用已经实现的方法,代码如下:
#import "UKit.h"#import <UIKit/UIKit.h>static UKit * _instance = nil;@implementation UKit+ (UKit *)instance{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        _instance = [[UKit alloc] init];    });    return _instance;}- (void)ShowWarningBox:(NSString *)strTitle text:(NSString *)message{    UIAlertController * alertController = [UIAlertController alertControllerWithTitle:strTitle message:message preferredStyle:UIAlertControllerStyleAlert];        UIAlertAction * okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {        NSLog(@"点击ok按钮");        UnitySendMessage("Canvas", "OnButtonClick", [@"你好啊Unity" UTF8String]);    }];        [alertController addAction:okAction];        UIAlertAction * cancleAction = [UIAlertAction actionWithTitle:@"cancle" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {        NSLog(@"点击了取消按钮");    }];    [alertController addAction:cancleAction];    UIViewController * viewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];    [viewController presentViewController:alertController animated:YES completion:^{        NSLog(@"显示了对话框");    }];}extern "C" {    void ShowWarningBox(char *strTitle, char *message)    {        [[UKit instance] ShowWarningBox:[NSString stringWithUTF8String:strTitle] text:[NSString stringWithUTF8String:message]];    }        void CallOC(int val1, float val2, bool val3, const char *val4) {        NSLog(@"Object-c Called. val1=%d, val2=%f, val3=%d, val4=%s", val1, val2, val3, val4);        NSString * title = @"标题";        NSString * message = [NSString stringWithFormat:@"Object-c Called. val1=%d, val2=%f, val3=%d, val4=%s", val1, val2, val3, val4];        [[UKit instance] ShowWarningBox:title text:message];    }        // C#函数的函数指针    typedef void (*cs_callback)(int);    void CallBack(cs_callback callback) {        callback(999);    }    }@end步骤二:


创建Assets/Plugins/iOS文件夹,并将OC文件拖到该文件夹下;打包后该文件也会包含在工程项目中,如图:

WeChat81ed0cab0d1ceabe481581792de472fc.png


WeChat213a3cf0c54e0a02a8e7b62cb0b9f44a.png

步骤三:


创建C#调用方法的文件,在其中导入OC文件中声明的C方法并进行调用,代码如下:
using UnityEngine;using System.Runtime.InteropServices;using AOT;public static class UnityIOSKit{    delegate void callback_delegate(int val);    [DllImport("__Internal")]    private static extern void ShowWarningBox(string strTitle, string message);    [DllImport("__Internal")]    private static extern void CallOC(int val1, float val2, bool val3, string val4);    // 声明包含回调方法的方法    [DllImport("__Internal")]    private static extern void CallBack(callback_delegate callback);    static public void ShowAlert(string strTitle, string strText)    {                if (Application.platform == RuntimePlatform.IPhonePlayer)        {            ShowWarningBox("提醒弹框", "弹框内容");        }    }    static public void myCallOC()    {        if (Application.platform == RuntimePlatform.IPhonePlayer)        {            CallOC(1314, 3.1415926f, true, "文字内容");        }    }    //回调函数,必须MonoPInvokeCallback并且是static    [MonoPInvokeCallback(typeof(callback_delegate))]    private static void cs_callback(int val)    {        UnityEngine.Debug.Log("cs_callback : " + val);    }    static public void CallBack()    {        if (Application.platform == RuntimePlatform.IPhonePlayer)        {            //直接把函数传过去            CallBack(cs_callback);        }    }}
参考:unity 与oc交互

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-25 04:34 , Processed in 0.092837 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表