關於Unity和iOS的交互,在網上看了不少文章後發現,其餘做者都有一個共同點,描述不完整,做者們覺得你們都知道而遺漏的東西,每每是令初學者頭疼的問題,由於遺漏的東西對於原生APP開發者來講可能並不清楚,也想不到,畢竟語法不同,概念不一樣,一個簡單的寫法的錯誤均可能功虧一簣,簡言之:重在細節ios
本篇文章就從unity和iOS(Objective-C語言)入手,重點介紹一下Unity和iOS如何如何相互調用bash
固然也有其餘的方式來寫交互,我只寫我本身認爲比較容易理解的一種函數
一.準備iOS代碼(即爲Unity提供接口文件)ui
iOS要寫的代碼文件要分爲兩部分 : ①接口文件 ②其它實現文件 Unity最終調用的iOS"接口文件"的方法名必須爲C語言形式,注意,只需方法名爲C語言形式,方法的實現依然能夠用OC語法來實現,除了"接口文件"以外的其餘實現文件"所有按照OC語法來寫 spa
建議寫法:.net
建立繼承自NSObject(其餘也行,根據自身狀況)的.h和.m文件,按照OC語法習慣,在.h文件中寫好方法名(在後面寫接口文件時須要用來調用),在.m文件中寫好這些接口的具體實現,這兩個文件總體做爲"實現文件"3d
例如: ①咱們建立的文件叫作Interactioncode
②在Interaction.h文件中咱們定義一個對象方法接口和一個類方法接口://根據名字來輸出他的身高
- (void)logHeightWithName:(NSString *)name;
//根據名字來輸出他的年齡
+ (void)logAgeWithName:(NSString *)name;
複製代碼
對應截圖:cdn
③在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歲");
}
}
複製代碼
對應截圖:
建立繼承自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的方法的話就至關簡單了,一句話搞定:
UnitySendMessage(const char * GameObjectName, const char *methodName, const char *msg);
舉個例子 : UnitySendMessage("UIChargeMoneyPage", "callback", "0");
①要在Unity導出的iOS項目中調,由於Unity導出的iOS項目中會包含UnityInterface.h文件,該文件中有UnitySendMessage的定義
掌握了這行代碼就足夠了,最重要的是裏面三個參數怎麼傳
第一個參數obj : 調用方法的對象 這個參數最難理解,在Unity中叫gameObject或者遊戲模型,其實就是iOS須要調用的方法所在的腳本,這個腳本所掛載的遊戲模型的名稱,注意:不必定是該腳本的名稱,要分清楚(若是還不懂,就問問大家的Unity,或者本身感受可能正確的名稱試一試)
第二個參數method : iOS要調用Unity腳本中的方法名(Unity腳本本身定義一個方法給iOS調用)
第三個參數msg : 就是上面method方法的參數
例: iOS中:
Unity腳本中:
1.寫的比較多,主要爲第一次作交互的小夥伴準備的,若是最後沒有實現,必定要把我寫的每句話都讀到,每一個細節都作到,若是還不行,能夠私信我,咱們討論
2.還有其餘的方式來寫交互,例如:推薦博客文章 - unity與ios交互那點事兒
3.碼字不易,感謝喜歡~!