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方法,我上面的例子是一个方法、同理可以传入多个方法指针,每个方法也可以添加返回值等。大家有不懂的可以留言和我交流哈。