前言
在游戲開發(fā)中,難免會出現(xiàn)與原生平臺有交互才能完成一些特定的必要的功能。比如iOS的內(nèi)購功能奉狈,或者你想用一款第三方SDK鳖昌,但是此SDK卻沒有對應平臺的版本备畦、并且未提供插件的情況下,就會涉及到與第三方平臺的交互许昨。
Unity3D
簡介:Unity3D(以下簡稱U3D)是由Unity Technologies開發(fā)的一個讓玩家輕松創(chuàng)建諸如三維視頻游戲懂盐、建筑可視化、實時三維動畫等類型互動內(nèi)容的多平臺的綜合型游戲開發(fā)工具糕档,是一個全面整合的專業(yè)游戲引擎莉恼。
Unity3D調(diào)用原生iOS接口
Unity3D 無法直接調(diào)用iOS原生的OC或者swift語言,但是Unity3D使用的C#可以和C進行交互速那。而C是可以和OC進行交互的俐银。從而就可以實現(xiàn)C#調(diào)用OC。
以ShareSDK的Unity橋接為例:
先定義 分享的C語言方法
void __iosShareSDKShare (int reqID, int platType, void *content, void *observer){
? ? NSMutableDictionary *shareParams = __getShareParamsWithString(contentStr);
? ? [ShareSDK share:platType
? ? ? ? parameters:shareParams
? ? onStateChanged:nil];
}
C#中則可以像下面代碼一樣進行引入和調(diào)用:
using System.Runtime.InteropServices;
[DllImport("__Internal")]private static extern void __iosShareSDKShare (int reqID, int platType, string content, string observer);
其中DllImport為一個Attribute端仰,目的是通過非托管方式將庫中的方法導出到C#中進行使用捶惜。而傳入"__Internal"則是表示這個是一個靜態(tài)庫或者是一個內(nèi)部方法。通過上面的聲明荔烧,這個方法就可以在C#里面進行調(diào)用了
比如Unity游戲需要分享的時候直接調(diào)用下面方法就可以了:
voidShareContent(intreqID, PlatformType platform, ShareContent content){
? ? __iosShareSDKShare (reqID, (int)platform, content.GetShareParamsStr(), _callbackObjectName);
}
iOS 調(diào)用Unity的接口
在特定場景下也會有iOS接口調(diào)用Unity的C#接口的情況售躁,比如分享后回調(diào)的分享結(jié)果就要傳遞到原生的unity層。最簡單的方式是通過UnitySendMessage方法來調(diào)用Unity所定義的方法茴晋。
仍然以ShareSDK的回調(diào)為例:
在Unity的里ShareSDK.cs定義一個回調(diào)方法
private void _Callback (string data) {
? ? Debug.LogFormat ("result string = {0}", data);
}
掛載ShareSDK.cs到Main Camera中 在OC層陪捷,在ShareSDK的分享回調(diào)block執(zhí)行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方式無法同步獲取返回值,并且必須要掛載到對象后才能調(diào)用诺擅,復雜需求可以使用 非托管的方式進行交互市袖,具體可以參考:http://www.reibang.com/p/1ab65bee6692
Cocos2d
是一個基于MIT協(xié)議的開源框架,用于構(gòu)建游戲、應用程序和其他圖形界面交互應用苍碟【泼伲可以讓你在創(chuàng)建自己的多平臺游戲時節(jié)省很多的時間。
由于主流的cocos2d游戲開發(fā)語言是C++,而C++ 和OC是可以直接交互的,只需把OC的實現(xiàn)文件.m修改為.mm即可微峰,那么只需要定義一個C++的接口直接調(diào)用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);
? ? }];
}