Unity3d與iOS交互開發——接入平臺SDK必備技能 – iPhone手機開發技術文章 iPhone軟體開發教學課程

前言廢話:開發手機遊戲都知道,你要接入各種平臺的SDK。那就需要Unity3d與iOS中Objective-C的函數有交互,所以你就需要用到如下內容:

一、Unity3d To iOS:

1、創建一個C#文件 SdkToIOS.cs 這是調用iOS函數的接口:

public class SdkToIOS: MonoBehaviour
{
	//平臺接入開關
	public static bool isOpenPlatform = false;
	
	//導入定義到.m文件中的C函數
    [DllImport("__Internal")]
    private static extern void _PlatformInit();
    
    //定義接口函數供遊戲邏輯調用
   	 public static void InitSDK()
  	{
        if (isOpenPlatform)
        {
            _PlatformInit();
        }
	}	
}

2、編寫與接口對應的Objective-c函數:

//  MyIOSSdk.h


#import 

@interface MyIOSSdk : NSObject

@end

//  MyIOSSdk.m

#import "MyIOSSdk.h"

//這裡引用SDK的頭文件
#import "SDKPlatform.h"

#if defined(__cplusplus)
extern "C"{
#endif
    extern void UnitySendMessage(const char *, const char *, const char *);
    extern NSString* _CreateNSString (const char* string);
#if defined(__cplusplus)
}
#endif

//*****************************************************************************

@implementation MyIOSSdk

//**********************
//message tools

+ (void)sendU3dMessage:(NSString *)messageName param:(NSDictionary *)dict
{
    NSString *param = @"";
    if ( nil != dict ) {
        for (NSString *key in dict)
        {
            if ([param length] == 0)
            {
                param = [param stringByAppendingFormat:@"%@=%@", key, [dict valueForKey:key]];
            }
            else
            {
                param = [param stringByAppendingFormat:@"&%@=%@", key, [dict valueForKey:key]];
            }
        }
    }
    UnitySendMessage("SDK_Object", [messageName UTF8String], [param UTF8String]);
}

//**********************
//SDK fun

//初始化SDK
-(void)SDKInit
{
	SDKcfg *cfg = [[[SDKcfg alloc] init] autorelease];
	cfg.appid =123456;
	cfg.appKey =@"aoaoaoaoaoaoaoaoaoaoaoaoaaoaoaoaoaoaoao";
	cfg.orientation = UIDeviceOrientationLandscapeLeft;
	//調用SDK的初始化函數
	[[SDKPlatform defaultPlatform] SDKInit:cfg];
	//添加回調監聽
	[[SDKPlatform defaultPlatform] addObserver:self selector:@selector(SNSInitResult:) name:(NSString *)kInitNotification object:nil];
}

//獲取用戶ID
-(NSString*)SDKGetUserID
{
	[[SDKPlatform defaultPlatform] SDKGetUserID];
}

//**********************
//call back fun

//初始化更新回調
- (void)SNSInitResult:(NSNotification *)notify
{
    [MyIOSSdk sendU3dMessage:@"SDKMsgInit" param:nil];
}

@end


//*****************************************************************************

#if defined(__cplusplus)
extern "C"{
#endif
    
	//字符串轉化的工具函數
	
    NSString* _CreateNSString (const char* string)
    {
        if (string)
            return [NSString stringWithUTF8String: string];
        else
            return [NSString stringWithUTF8String: ""];
    }
    
    char* _MakeStringCopy( const char* string)
    {
        if (NULL == string) {
            return NULL;
        }
        char* res = (char*)malloc(strlen(string)+1);
        strcpy(res, string);
        return res;
    }
    
    static MyIOSSdk *mySDK;


	//供u3d調用的c函數
  
    void _PlatformInit()
    {
        if(mySDK==NULL)
        {
            mySDK = [[MyIOSSdk alloc]init];
        }
        [lsSDK SDKInit];
    }
	
	//註意這個函數是返回字符串
	const char* _PlatformGetUin()
	{
		if(lsSDK==NULL)
        {
            lsSDK = [[MyIOSSdk alloc]init];
        }
		return _MakeStringCopy([[lsSDK SDKGetUserID] UTF8String]);
	}
    
#if defined(__cplusplus)
}
#endif

值得一提的是在上面的代碼中特意寫瞭一個返回字符串的例子,因為你要獲取用戶ID 、昵稱什麼的。對應在cs文件中導入函數如下:

[DllImport ("__Internal")]
private static extern string _PlatformGetUin();

這裡的const char* 會被C#自動轉換成string因為在m文件中使用瞭內存申請,該段內存自然是處在堆內存中,這樣轉成string符合c#的內存管理機制,我們不用擔心它的釋放問題。

3、在你的工程目錄中找個地方保存iOS的文件

打包出XCode工程後導入進去,加入你的SDK就可以瞭。

有一點需要說明,如果存放目錄為\Assets\Plugins\iOS,那麼Unity3d會自動將該目錄下的所有文件(暫不支持子文件夾)當做插件文件打包到Xcode工程下的Libraries目錄下,這樣你就不需要在手動添加瞭,否則會報錯重復聲明什麼的。

這種文件各個平臺會有多個,可以使用同一頭文件且定義的C函數名也都相同,這樣更有利於多版本管理。

二、iOS To Unity3d

這個在上面的 MyIOSSdk.m 文件中已經有劇透瞭,就是利用unity3d 的UnitySendMessage函數,其中參數1是場景中接受消息的對象,參數2是要執行的函數名,參數3為傳入參數,隻要按照如下步驟就可以實現這個機制:

1、在場景中創建一個對象用於接受iOS消息,或者用現有的也可以;

2、為SDK消息寫一個腳本,裡面包含各種消息函數;

3、將腳本掛到之前創建的對象上完事;

需要註意:這個對象在場景切換時候要始終存在,或者你在每個場景中都加個這玩意也可以,總之隻要能收到消息就行瞭;

另外,針對參數的傳遞對應上面的sendU3dMessage函數,我還在消息接受腳本中寫過一個消息參數的解析:

	void ParseMsg(string msg, out Dictionary dicMsg){
		if( null == msg || 0 == msg.Length ){
			dicMsg = null;
			return;
		}
		dicMsg = new Dictionary();
		string[] msgArray = msg.Split('&');
		for( int i=0; i<msgArray.Length; i++){
			string[] elementArray = msgArray[i].Split('=');
			dicMsg.Add(elementArray[0],elementArray[1]);
		}
	}

這個我自己都還沒有實際使用過,有錯誤自行解決大致是這樣。

ps:關於SDK的接入還有 android版本的尚未研究網上有很多可以參照;

pps:SDK多版本管理和研究我也在摸索中,哪位大神比較熟悉不吝賜教,本人萬分感激,之前到是看過這個https://www.xuanyusong.com/archives/2418#comments

ppps:轉載請註明來自:https://blog.csdn.net/zhao_yin

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *