unity3d是一個跨平臺的應(yīng)用非常廣泛的3d引擎,本文記錄的是自己將其應(yīng)用到iOS平臺時遇到的一些問題和解決辦法,當(dāng)然抒寂,有些辦法應(yīng)該是不怎么成熟的结啼,望見諒和指教。
一屈芜、生成XCode工程
打開Unity3d Editor (這里介紹的是5.4版本)的界面 郊愧,點擊 File > Build Settings 就會看到一個平臺選擇界面朴译,選擇iOS平臺,
點擊右下角的按鈕 “Build And Run”
輸入XCode的工程名和保存路徑属铁,點擊“save”進(jìn)入下一步眠寿,就會看到一個提示框。
注意這個提示框的選擇很重要焦蘑,如果選擇 Replace 就會覆蓋上一步你所選擇的XCode保存路徑下原有的XCode工程盯拱,所有的XCode代碼都會進(jìn)行重新生成;如果選擇 Append 例嘱,其實這里理解成Modify(更改) 可能會更好一些狡逢,它的功能是,如果在 Unity3d Editor 下有所更改就拼卵,就會將Unity3d Editor 下的更改添加到XCode工程中奢浑,如果你在XCode工程下有過其他iOS部分的更改,比如添加代碼腋腮、修改代碼的等等操作雀彼,是不會被點擊Append這個動作而被覆蓋掉的。接下來即寡,Unity3d Editor 會自動生成一個XCode工程徊哑,并開始運行。
二嘿悬、調(diào)用XCode工程的iOS代碼
Unity3d Editor 使用的語言是Javascript 或者C#实柠,而iOS應(yīng)用部分的代碼一般采用Objective-C或Swift。那么兩者之間如何能建立通信和調(diào)用呢善涨?
實際上Unity3d Editor 在生成XCode工程之后窒盐,如果打開XCode工程下Classes/Native文件夾下的文件我們會發(fā)現(xiàn)其實所有的Javascript和C#代碼在XCode下都變成了C/C++代碼,我想這也是Unity3d能夠?qū)崿F(xiàn)跨平臺的根本原因钢拧,其原理與Cocos2D-X一樣在進(jìn)行最后編譯前的最終代碼都是C/C++代碼蟹漓。所以在為Unity3d 編寫iOS插件時,C/C++自然的也會變成橋梁語言源内。
具體方法:
首先葡粒,在Unity3d Editor下的Assets下創(chuàng)建文件夾Plugins 注意名字不要寫錯,在Plugins文件夾再創(chuàng)建IOS文件夾膜钓,
以及C#腳本callIOS.cs (腳本的名字由程序員自己定義嗽交,這里我定義為callIOS),代碼如下
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
public class callIOS:MonoBehaviour
{
//Use this for initialization
void Start(){
}
public void OpenIOS(){
OpenMainView("http://www.reibang.com/users/7a5c5d5e46f7/latest_articles");
}
//引入內(nèi)部動態(tài)鏈接庫函數(shù)
[DllImportAttribute("__Internal")]
public static extern int OpenMainView(string url);
}
代碼中的OpenMainView調(diào)用的iOS的插件方法颂斜,這個方法將在Plugins文件夾下的IOS文件夾下實現(xiàn)夫壁。在IOS文件夾下創(chuàng)建文件Test.mm (這個橋接代碼文件的名字由程序員自己定義,我這里命名為Test)沃疮,用本文第一步介紹的步驟生成XCode工程盒让,在XCode工程目錄下面將可以看到Test.mm文件梅肤,
在Test.mm文件下添加如下代碼:
#import <Foundation/Foundation.h>
#import "UnityAppController.h"
#import "MainViewController.h"
extern "C" int OpenMainView(const char *url){
//獲取Unity rootviewcontroller
UIViewController *unityRootVC = UnityGetGLViewController();
UIView *unityView = UnityGetGLView();
//創(chuàng)建我們需要打開的mainview
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard"
bundle: nil];
MainViewController *mainVC = [storyboard instantiateViewControllerWithIdentifier:@"MainViewController"];
UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:mainVC];
//添加到Unity場景的rootview
[unityRootVC addChildViewController:navVC];
[unityView addSubview:navVC.view];
return 0;
}
這段代碼中MainViewController 是你在XCode 中iOS應(yīng)用的界面代碼,由程序員自己定義邑茄,只要Unity3D 部分的C#代碼調(diào)用 callIOS 類的OpenIOS 方法姨蝴,就會彈出MainViewController 的界面。
需要注意的地方:
雖然Test.mm 是放在Plugins/IOS 文件夾下面肺缕,但是并不代表.storyboard 或者 .nib 等文件也可以放在此文件夾下左医,實際上,Unity3D應(yīng)該是對Plugins文件夾下的IOS代碼做了限制搓谆,經(jīng)調(diào)試發(fā)現(xiàn)一般只能存放純代碼文件炒辉,不能放置 .framework 、.storyboard 泉手、.xib黔寇、.nib 、.png等等資源性質(zhì)的文件斩萌,這部分代碼最好在生成XCode的工程下添加到Classes 工程目錄下缝裤。由于我的工程iOS部分(與Unity3D的腳本部分相對而言)邏輯比較復(fù)雜,所以我采用的方式是將iOS部分主要邏輯代碼放到 Classes 目錄下颊郎,Plugins/IOS 只用來存放簡單橋接Unity3D腳本代碼和iOS應(yīng)用部分的代碼憋飞。也因為如此,如果在Unity3d Editor中改變腳本代碼后再次生成XCode工程時姆吭,必須選擇“Append”榛做,以免自己的iOS部分代碼(不在Plugins文件夾下的代碼)被覆蓋掉,這一點需要切記内狸。
這里只是調(diào)通C#代碼調(diào)用iOS的插件,其實iOS應(yīng)用部分也可以通過方法UnitySendMessage("obj","method","") 來調(diào)用C# 或者JS部分的方法昆淡,實現(xiàn)Unity3d 腳本與iOS部分代碼的雙向通信锰瘸。關(guān)于這一點以后有機(jī)會再表述。