[Unity3D]關(guān)于XCode 工程的生成和 iOS 插件的編寫

unity3d是一個跨平臺的應(yīng)用非常廣泛的3d引擎,本文記錄的是自己將其應(yīng)用到iOS平臺時遇到的一些問題和解決辦法,當(dāng)然抒寂,有些辦法應(yīng)該是不怎么成熟的结啼,望見諒和指教。

一屈芜、生成XCode工程

打開Unity3d Editor (這里介紹的是5.4版本)的界面 郊愧,點擊 File > Build Settings 就會看到一個平臺選擇界面朴译,選擇iOS平臺,


BuildSettings界面.png

點擊右下角的按鈕 “Build And Run”


BuildIOS界面.png

輸入XCode的工程名和保存路徑属铁,點擊“save”進(jìn)入下一步眠寿,就會看到一個提示框。
BuildIOSWarning界面.png

注意這個提示框的選擇很重要焦蘑,如果選擇 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)用呢善涨?


XCode工程下Classes:Native文件夾.png

實際上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文件夾膜钓,

Assets下創(chuàng)建文件夾Plugins.png

以及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文件在XCode下的路徑.png

在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文件夾下的代碼)被覆蓋掉,這一點需要切記内狸。

iOS應(yīng)用部分代碼存放路徑(包括圖片检眯、庫等等文件).png

這里只是調(diào)通C#代碼調(diào)用iOS的插件,其實iOS應(yīng)用部分也可以通過方法UnitySendMessage("obj","method","") 來調(diào)用C# 或者JS部分的方法昆淡,實現(xiàn)Unity3d 腳本與iOS部分代碼的雙向通信锰瘸。關(guān)于這一點以后有機(jī)會再表述。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昂灵,一起剝皮案震驚了整個濱河市避凝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌眨补,老刑警劉巖管削,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撑螺,居然都是意外死亡含思,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門实蓬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茸俭,“玉大人,你說我怎么就攤上這事安皱〉鼢蓿” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵酌伊,是天一觀的道長腾窝。 經(jīng)常有香客問我,道長居砖,這世上最難降的妖魔是什么虹脯? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮奏候,結(jié)果婚禮上循集,老公的妹妹穿的比我還像新娘。我一直安慰自己蔗草,他們只是感情好咒彤,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咒精,像睡著了一般镶柱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上模叙,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天歇拆,我揣著相機(jī)與錄音,去河邊找鬼范咨。 笑死故觅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的湖蜕。 我是一名探鬼主播逻卖,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昭抒!你這毒婦竟也來了评也?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤灭返,失蹤者是張志新(化名)和其女友劉穎盗迟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熙含,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡罚缕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了怎静。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邮弹。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡黔衡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腌乡,到底是詐尸還是另有隱情盟劫,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布与纽,位于F島的核電站侣签,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏急迂。R本人自食惡果不足惜影所,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望僚碎。 院中可真熱鬧猴娩,春花似錦、人聲如沸听盖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹃操。三九已至颜说,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腰吟,已是汗流浹背无埃。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留毛雇,地道東北人嫉称。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像灵疮,于是被迫代替她去往敵國和親织阅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容