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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM