iOS开发之OC和unity交互
1、unity调用OC
OC类代码
// testUnity.h extern "C"{ //声明一个方法 void testUnityFunction(int index, const char *userName); }
// testUnity.m extern "C"{ void testUnityFunction(int index, const char *userName) { NSLog(@"接收到来自unity的传参"); } }
unity的C#文件代码
#if UNITY_IOS //引入声明 [DllImport("__Internal")] static extern void testUnityFunction (int index, string str); #endif //实现方法 void Start() { #if UNITY_IOS testUnityFunction(1, "hello World"); #endif }
这样就可以直接实现unity调用OC。
2、OC回调unity:这里我们使用函数指针接口方法进行回调,可以传参,也可以带返回参数
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方法,我上面的例子是一个方法、同理可以传入多个方法指针,每个方法也可以添加返回值等。大家有不懂的可以留言和我交流哈。