Unity3D與iOS交互詳解(重在細節)

前言

關于Unity和iOS的交互,在網上看了很多文章后發現,其他作者都有一個共同點,描述不完整,作者們以為大家都知道而遺漏的東西,往往是令初學者頭疼的問題,因為遺漏的東西對于原生APP開發者來說可能并不清楚,也想不到,畢竟語法不一樣,概念不同,一個簡單的寫法的錯誤都可能功虧一簣,簡言之:重在細節

本篇文章就從unity和iOS(Objective-C語言)入手,重點介紹一下Unity和iOS如何如何相互調用

當然也有其他的方式來寫交互,我只寫我自己認為比較容易理解的一種

Unity調用iOS

一.準備iOS代碼(即為Unity提供接口文件)

  • 1. iOS寫什么樣的代碼Unity才可以調的起來呢?

iOS要寫的代碼文件要分為兩部分 : ①接口文件 ②其它實現文件
Unity最終調用的iOS"接口文件"的方法名必須為C語言形式,注意,只需方法名為C語言形式,方法的實現依然可以用OC語法來實現,除了"接口文件"之外的其他實現文件"全部按照OC語法來寫

圖示關系.png

建議寫法:

1.1創建實現文件

創建繼承自NSObject(其他也行,根據自身情況)的.h和.m文件,按照OC語法習慣,在.h文件中寫好方法名(在后面寫接口文件時需要用來調用),在.m文件中寫好這些接口的具體實現,這兩個文件整體作為"實現文件"

例如:

①我們創建的文件叫做Interaction
1.創建的文件.png

②在Interaction.h文件中我們定義一個對象方法接口和一個類方法接口:
  //根據名字來輸出他的身高
  - (void)logHeightWithName:(NSString *)name;
  //根據名字來輸出他的年齡
  + (void)logAgeWithName:(NSString *)name;

對應截圖:
Interaction.h.png

③在Interaction.m文件中實現以上兩個接口:

- (void)logHeightWithName:(NSString *)name{
  if ([name isEqualToString:@"xiaoming"]) {
      NSLog(@"xiaoming的身高是175cm");
  }else{
      NSLog(@"dabai的身高是188cm");
  }
}

+ (void)logAgeWithName:(NSString *)name{
  if ([name isEqualToString:@"xiaoming"]) {
      NSLog(@"xiaoming今年18歲");
  }else{
      NSLog(@"dabai今年22歲");
  }
}

對應截圖:
Interaction.m.png
1.2 創建接口文件

創建繼承自NSObject的"接口文件",我們命名為PortFile


接口文件.png

①PortFile.h文件中可以寫接口方法名,也可以不寫
代碼:

//
//  PortFile.h
//  Unity-iPhone
//
//  Created by Tynn on 2018/1/18.
//

#import <Foundation/Foundation.h>

@interface PortFile : NSObject

//接口文件中的.h文件中可以加上接口,也可以不用寫

/*

void initInteraction()

void logHisHeightWithName(const char *name);

void logHisAgeWithName(const char *name);

*/

@end

對應截圖:
PortFile.h.png

②PortFile.m文件中寫具體的方法實現,這里的方法實現調用的是我們上面第一部創建的"實現文件".h中的接口
代碼:

//
//  PortFile.m
//  Unity-iPhone
//
//  Created by Tynn on 2018/1/18.
//

#import "PortFile.h"
#import "Interaction.h"

//@implementation PortFile
//
//@end

Interaction *inter = nil;
//實例化Interaction
void initInteraction(){
  inter = [[Interaction alloc]init];
}

void logHisHeightWithName(const char *name){
  //將C字符串轉化為OC字符串
  NSString *hisName = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
  //調用Interaction的對象方法
  [inter logHeightWithName:hisName];
}

void logHisAgeWithName(const char *name){
  //將C字符串轉化為OC字符串
  NSString *hisName = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
  //調用Interaction的類方法
  [Interaction logAgeWithName:hisName];
}

對應截圖:


PortFile.m

至此,iOS的代碼部分已經寫完了,當Unity調用iOS的方法時,其實調用的就是PortFile.m中上圖紅框圈的這三個方法:

void initInteraction();
void logHisHeightWithName(const char *name);
void logHisAgeWithName(const char *name);

二.Unity調用PortFile中的接口

1.找到Unity項目,將我們寫的iOS文件全部Copy到Plug/iOS文件夾中


image.png

2.打開Unity項目,找到需要用到iOS對應的腳本文件
3.在該腳本頭部引入命名空間 using System.Runtime.InteropServices;
4.標識用Objective-C/C++實現的函數
注意:我們定義的參數類型為const char *name,但是在Unity接收時要轉化為C#能識別的參數類型string
5.調用Unity標識的iOS方法,傳遞參數

圖示步驟.png

6.將Uinty項目打包成iOS,啟動


image.png

iOS調用Unity

iOS調用Unity的方法的話就相當簡單了,一句話搞定:

UnitySendMessage(const char * GameObjectName, const char *methodName, const char *msg);

舉個例子 : UnitySendMessage("UIChargeMoneyPage", "callback", "0");

注意點:UnitySendMessage這個方法不能直接調,用Xcode直接創建的iOS項目會找不到該方法,所以:

①要在Unity導出的iOS項目中調,因為Unity導出的iOS項目中會包含UnityInterface.h文件,該文件中有UnitySendMessage的定義


image.png

掌握了這行代碼就足夠了,最重要的是里面三個參數怎么傳

Unity腳本中:


image.png
掛載對象與腳本關系.png
  • 結果


    image.png

總結

1.寫的比較多,主要為第一次做交互的小伙伴準備的,如果最后沒有實現,一定要把我寫的每句話都讀到,每個細節都做到,如果還不行,可以私信我,我們討論
2.還有其他的方式來寫交互,例如:推薦博客文章 - unity與ios交互那點事兒
3.碼字不易,感謝喜歡~!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。