前言
在遊戲開發中,難免會出現與原生平臺有交互才能完成一些特定的必要的功能。比如iOS的內購功能,或者你想用一款第三方SDK,但是此SDK卻沒有對應平臺的版本、並且未提供插件的情況下,就會涉及到與第三方平臺的交互。
Unity3D
簡介:Unity3D(以下簡稱U3D)是由Unity Technologies開發的一個讓玩家輕鬆創建諸如三維視頻遊戲、建築可視化、實時三維動畫等類型互動內容的多平臺的綜合型遊戲開發工具,是一個全面整合的專業遊戲引擎。
Unity3D調用原生iOS接口
Unity3D 無法直接調用iOS原生的OC或者swift語言,但是Unity3D使用的C#可以和C進行交互。而C是可以和OC進行交互的。從而就可以實現C#調用OC。
以ShareSDK的Unity橋接為例:
先定義 分享的C語言方法
C#中則可以像下面代碼一樣進行引入和調用:
using System.Runtime.InteropServices;[DllImport("__Internal")]private static extern void __iosShareSDKShare (int reqID, int platType, string content, string observer);
比如Unity遊戲需要分享的時候直接調用下面方法就可以了:
void ShareContent (int reqID, PlatformType platform, ShareContent content) { __iosShareSDKShare (reqID, (int)platform, content.GetShareParamsStr(), _callbackObjectName);}
iOS 調用Unity的接口
在特定場景下也會有iOS接口調用Unity的C#接口的情況,比如分享後回調的分享結果就要傳遞到原生的unity層。最簡單的方式是通過
UnitySendMessage方法來調用Unity所定義的方法。仍然以ShareSDK的回調為例:
在Unity的裡ShareSDK.cs定義一個回調方法
private void _Callback (string data) { Debug.LogFormat ("result string = {0}", data);}
掛載ShareSDK.cs到Main Camera中
在OC層,在ShareSDK的分享回調block執行UnitySendMessage
void __iosShareSDKShare (int reqID, int platType, void *content, void *observer) { NSMutableDictionary *shareParams = __getShareParamsWithString(contentStr); [ShareSDK share:platType parameters:shareParams onStateChanged:^(SSDKResponseState state, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error) { NSString *resultStr = nil; // process resultStr // ... UnitySendMessage(observer, "_Callback", [resultStr UTF8String]); }]; }
其中 observer值為掛載的"Main Camera"
注意:UnitySendMessage方式無法同步獲取返回值,並且必須要掛載到對象後才能調用,複雜需求可以使用 非託管的方式進行交互,具體可以參考:https://www.jianshu.com/p/1ab65bee6692
Cocos2d
是一個基於MIT協議的開源框架,用於構建遊戲、應用程序和其他圖形界面交互應用。可以讓你在創建自己的多平臺遊戲時節省很多的時間。
由於主流的cocos2d遊戲開發語言是C++,而C++ 和OC是可以直接交互的,只需把OC的實現文件.m修改為.mm即可,那麼只需要定義一個C++的接口直接調用OC既可
typedef void(*C2DXShareResultEvent) (int reqID, C2DXResponseState state, C2DXPlatType platType, C2DXDictionary *res);void C2DXiOSShareSDK::shareContent(int reqID,C2DXPlatType platType, C2DXDictionary *content,bool useClientShare, C2DXShareResultEvent callback) { NSMutableDictionary *parameters = convertPublishContent(content); [ShareSDK share:(SSDKPlatformType)platType parameters:parameters onStateChanged:^(SSDKResponseState state, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error) { // process callback ... //callback callback(reqID,(C2DXResponseState)state,(C2DXPlatType)platType,userInfoDict); }];}
[ShareSDK] 輕鬆實現社會化功能 強大的社交分享
[SMSSDK] 快速集成短信驗證 聯結通訊錄社交圈
[MobLink] 打破App孤島 實現Web與App無縫鏈接
[MobPush] 快速集成推送服務 應對多樣化推送場景
[Mob統計分析] 精準化行為分析 + 多維數據模型 + 匹配全網標籤 + 垂直行業分析顧問
BBSSDK | ShareREC | MobAPI | MobPay | ShopSDK | MobIM | App工廠
截止 2018 年4 月,Mob 開發者服務平臺全球設備覆蓋超過 84 億,SDK下載量超過 3,300,000+次,服務超過 380,000+款移動應用
閱讀更多 Mob開發者服務平臺 的文章