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

前言

關於Unity和iOS的交互,在網上看了不少文章後發現,其餘做者都有一個共同點,描述不完整,做者們覺得你們都知道而遺漏的東西,每每是令初學者頭疼的問題,由於遺漏的東西對於原生APP開發者來講可能並不清楚,也想不到,畢竟語法不同,概念不一樣,一個簡單的寫法的錯誤均可能功虧一簣,簡言之:重在細節ios

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

固然也有其餘的方式來寫交互,我只寫我本身認爲比較容易理解的一種函數

Unity調用iOS

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

  • 1. iOS寫什麼樣的代碼Unity才能夠調的起來呢?

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

圖示關係.png

建議寫法:.net

1.1建立實現文件

建立繼承自NSObject(其餘也行,根據自身狀況)的.h和.m文件,按照OC語法習慣,在.h文件中寫好方法名(在後面寫接口文件時須要用來調用),在.m文件中寫好這些接口的具體實現,這兩個文件總體做爲"實現文件"3d

例如: ①咱們建立的文件叫作Interactioncode

1.建立的文件.png
②在Interaction.h文件中咱們定義一個對象方法接口和一個類方法接口:

//根據名字來輸出他的身高
  - (void)logHeightWithName:(NSString *)name;
  //根據名字來輸出他的年齡
  + (void)logAgeWithName:(NSString *)name;
複製代碼

對應截圖:cdn

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.碼字不易,感謝喜歡~!

相關文章
相關標籤/搜索