天天看點

ios與unity互動

Object-c小知識:

在接入sdk過程中會遇到需要調用sdk方法

在oc文法中 分為+(void) 和-(void)兩種方式

+(void)為類函數,可以直接調用,使用方法為:[類名  方法名:參數];

-(void)為成員函數,用C#的文法來說就是需要執行個體化類才能調用,使用方式為:

類名 * 定義名=[[類名 alloc] init];

[定義名 方法名:參數];

unity發送消息給ios:

在unity腳本中引用using System.Runtime.InteropServices;

需要使用到DllImport,其作用是提供從非托管DLL導出的函數的必要調用資訊

寫法格式為:

static:靜态方法。(靜态方法:不屬于類的執行個體,而是屬于類本身

extern:支援在外部實作方法。

[DllImport("__Internal")]
private static extern void _Method();

public void Method(){    _Method();    }

void Start () 
{
    Method();
}
           

然後在ios使用object-c編寫與unity互動,在頭檔案.h中 聲明

@interface UnityMessage : NSObject


@end
           

然後把.m源檔案字尾名更換為.mm檔案,這樣做的意義是讓源檔案可以包含c++格式的代碼,在.mm源檔案中書寫格式為:

@implementation UnityMessage

extern "C"
{
   void _Method()
   {
     NSLog(@"調用ios");
     //TODO 
   }
}

@end
           

以上,在遊戲運作時就會調用到在.mm源代碼檔案裡的_Mehod()方法了

ios發送消息給unity:

在這裡直接使用提供好的api就可以了UnitySendMessage,采用上面的例子

@implementation UnityMessage

extern "C"
{
   void _Method()
   {
     NSLog(@"調用ios");
     //TODO 
     UnitySendMessage("GameObject","test1","Value");
   }
}

@end
           

參數一:是需要提供腳本挂載的物體名稱,如果挂載在主錄影機上,那這裡就填”Main Camera“。

參數二:這裡需要注意,填寫的是方法名,而不是類名,unity提供的這個SendMessage方法機制是根據提供的挂載體周遊需要調用的方法,保證方法名是唯一就行,這種方式在效率肯定是不怎麼樣的,不過好像傳遞消息隻能通過這樣·····

參數三:這是需要傳遞的參數,如果不需要傳值就用”“就行。

其他:

unity傳string類型參數,ios方面表現void _Method(char * s)

然後[NSString stringWithUTF8String:s]轉化成object-c文法裡的NSString類型。

字元串拼接傳遞:

NSString* User= [[NSString alloc]initWithFormat:@"%@,%@",userID,account];

UnitySendMessage("Object","GetUserMessage",[User UTF8String]);