iOS开发之OC调用unity
OC回调unity
有两种方法
第一种:
UnitySendMessage方式(接口声明固定,只能是void method(string message);不能带有返回值;必须要挂载到对象后才能调用。
)
使用方法很简单
NSString *resultStr = @"hello world"; UnitySendMessage("Main Camera", "callback", resultStr.UTF8String);
第二种:
使用函数指针接口方法进行回调,可以传参,也可以带返回参数,调用灵活
C#文件代码
void Start() { #if UNITY_IOS //设置回调托管函数指针 eckShowPlayer handler = new eckShowPlayer(eckShowPlayerHandler); IntPtr showPlayer = Marshal.GetFunctionPointerForDelegate(handler); //调用OC的方法,将C#的回调方法函数指针传给OC eckRegisterRecieveGameCallback(showPlayer); #endif } #if UNITY_IOS //声明一个OC的注册回调方法函数指针的函数方法,每一个参数都是函数指针 [DllImport("__Internal")] public static extern void eckRegisterRecieveGameCallback( IntPtr showPlayer ); //先声明方法、delegate修饰标记是回调方法 [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void eckShowPlayer(string userId); //实现回调方法 MonoPInvokeCallback修饰会让OC通过函数指针回调此方法 [AOT.MonoPInvokeCallback(typeof(eckShowPlayer))] static void eckShowPlayerHandler(string userId) { Debug.Log("收到来自oc的参数 - "+userId ); } #endif
OC代码
// testUnity.h //定义一个名字参数和C#类一样的方法 typedef void (*eckShowPlayerHandler) (const char *userId); extern "C"{ /** 设置回调游戏的托管函数 */ void eckRegisterRecieveGameCallback(eckShowPlayerHandler showPlayer); }
// testUnity.m //生命一个静态变量存储回调unity的函数指针 static eckShowPlayerHandler showPlayerBlock; extern "C"{ /** 设置回调游戏的托管函数 */ void eckRegisterRecieveGameCallback(eckShowPlayerHandler showPlayer) { showPlayerBlock = showPlayer; } }
这样在OC想要回调游戏的是时候即可调用 showPlayerBlock 就行了。
其实大概流程就是先将C#的函数指针存入OC内存,在OC需要回调unity的时候就可以使用不同的指针来回调不同的unity方法,我上面的例子是一个方法、同理可以传入多个方法指针,每个方法也可以添加返回值等。大家有不懂的可以留言和我交流哈。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!