前言
關于Unity和iOS的交互,在網上看了很多文章后發現,其他作者都有一個共同點,描述不完整,作者們以為大家都知道而遺漏的東西,往往是令初學者頭疼的問題,因為遺漏的東西對于原生APP開發者來說可能并不清楚,也想不到,畢竟語法不一樣,概念不同,一個簡單的寫法的錯誤都可能功虧一簣,簡言之:重在細節
本篇文章就從unity和iOS(Objective-C語言)入手,重點介紹一下Unity和iOS如何如何相互調用
當然也有其他的方式來寫交互,我只寫我自己認為比較容易理解的一種
Unity調用iOS
一.準備iOS代碼(即為Unity提供接口文件)
-
1. iOS寫什么樣的代碼Unity才可以調的起來呢?
iOS要寫的代碼文件要分為兩部分 : ①接口文件 ②其它實現文件
Unity最終調用的iOS"接口文件"的方法名必須為C語言形式,注意,只需方法名為C語言形式,方法的實現依然可以用OC語法來實現,除了"接口文件"之外的其他實現文件"全部按照OC語法來寫
建議寫法:
1.1創建實現文件
創建繼承自NSObject(其他也行,根據自身情況)的.h和.m文件,按照OC語法習慣,在.h文件中寫好方法名(在后面寫接口文件時需要用來調用),在.m文件中寫好這些接口的具體實現,這兩個文件整體作為"實現文件"
例如:
②在Interaction.h文件中我們定義一個對象方法接口和一個類方法接口:
//根據名字來輸出他的身高
- (void)logHeightWithName:(NSString *)name;
//根據名字來輸出他的年齡
+ (void)logAgeWithName:(NSString *)name;
對應截圖:③在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歲");
}
}
對應截圖:1.2 創建接口文件
創建繼承自NSObject的"接口文件",我們命名為PortFile
①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.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];
}
對應截圖:
至此,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文件夾中
2.打開Unity項目,找到需要用到iOS對應的腳本文件
3.在該腳本頭部引入命名空間 using System.Runtime.InteropServices;
4.標識用Objective-C/C++實現的函數
注意:我們定義的參數類型為const char *name,但是在Unity接收時要轉化為C#能識別的參數類型string
5.調用Unity標識的iOS方法,傳遞參數
6.將Uinty項目打包成iOS,啟動
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的定義
掌握了這行代碼就足夠了,最重要的是里面三個參數怎么傳
第一個參數obj : 調用方法的對象
這個參數最難理解,在Unity中叫gameObject或者游戲模型,其實就是iOS需要調用的方法所在的腳本,這個腳本所掛載的游戲模型的名稱,注意:不一定是該腳本的名稱,要分清楚(如果還不懂,就問問你們的Unity,或者自己感覺可能正確的名稱試一試)第二個參數method : iOS要調用Unity腳本中的方法名(Unity腳本自己定義一個方法給iOS調用)
第三個參數msg : 就是上面method方法的參數
-
例:
iOS中:
iOS調用Unity方法.png
Unity腳本中:
-
結果
image.png
總結
1.寫的比較多,主要為第一次做交互的小伙伴準備的,如果最后沒有實現,一定要把我寫的每句話都讀到,每個細節都做到,如果還不行,可以私信我,我們討論
2.還有其他的方式來寫交互,例如:推薦博客文章 - unity與ios交互那點事兒
3.碼字不易,感謝喜歡~!