摘要: 前言 在遊戲開發中,不免會出現與原平生臺有交互才能完成一些特定的必要的功能。好比iOS的內購功能,或者你想用一款第三方SDK,可是此SDK卻沒有對應平臺的版本、而且未提供插件的狀況下,就會涉及到與第三方平臺的交互。ios
前言swift
在遊戲開發中,不免會出現與原平生臺有交互才能完成一些特定的必要的功能。好比iOS的內購功能,或者你想用一款第三方SDK,可是此SDK卻沒有對應平臺的版本、而且未提供插件的狀況下,就會涉及到與第三方平臺的交互。框架
Unity3D工具
簡介:Unity3D(如下簡稱U3D)是由Unity Technologies開發的一個讓玩家輕鬆建立諸如三維視頻遊戲、建築可視化、實時三維動畫等類型互動內容的多平臺的綜合型遊戲開發工具,是一個全面整合的專業遊戲引擎。開發工具
Unity3D調用原生iOS接口動畫
Unity3D 沒法直接調用iOS原生的OC或者swift語言,可是Unity3D使用的C#能夠和C進行交互。而C是能夠和OC進行交互的。從而就能夠實現C#調用OC。插件
以ShareSDK的Unity橋接爲例:code
先定義 分享的C語言方法orm
void __iosShareSDKShare (int reqID, int platType, void *content, void *observer){ NSMutableDictionary *shareParams = __getShareParamsWithString(contentStr); [ShareSDK share:platType parameters:shareParams onStateChanged:nil]; }
C#中則能夠像下面代碼同樣進行引入和調用:視頻
using System.Runtime.InteropServices; [DllImport("__Internal")] private static extern void __iosShareSDKShare (int reqID, int platType, string content, string observer);
其中DllImport爲一個Attribute,目的是經過非託管方式將庫中的方法導出到C#中進行使用。而傳入"__Internal"則是表示這個是一個靜態庫或者是一個內部方法。經過上面的聲明,這個方法就能夠在C#裏面進行調用了
好比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); }]; }