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