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