此篇文章基于Unity version 5.3.6p6 與Xcode7.3。
在項目開發(fā)過程中,因為Unity3D打包之后默認都是只能用真機運行。其實Unity3D打包的項目也是可以用模擬器運行的,只是需要改下配置。
一、Unity3D打包后iOS如何使用模擬器?
(如果真機運行,不需要模擬器忽略此處,直切跳轉(zhuǎn)到二。暫時沒有研究如何打包后同時使用真機和模擬器, 可以分開打包)
具體步驟如下:
1.打開Unity3D項目,點擊菜單欄File選項,然后點擊Build Settings (快捷鍵Command+Shift+B),點擊Player Settings進入配置界面,如圖

找到最下面Other Settings設(shè)置里面的Target SDK (不同的Unity3D版本可能不同,有的是SDK Verson)。這里默認的是Device SDK,既真機狀態(tài)。我們想要在模擬器下,此處選擇Simulator SDK。然后就可以打包了。(注:選項Target Device 可以選擇我們需要運行的設(shè)備,默認是iPhone+iPad)

2.打包成功以后,打開Unity-iPhone.xcodeproj。查看工程狀態(tài)。我的工程是可以直接運行各個模擬器了。有的時候會出現(xiàn)如圖現(xiàn)象,不要著急

進入工程設(shè)置Build Settings 設(shè)置界面,在Architectures目錄下,找到Supported Platforms,選擇iOS,這時候在工程里面就可以選擇各個模擬器運行了。(這里可以選擇你支持的各個平臺類型)

二.Unity3D與iOS交互~~簡單的傳值
?Unity3D和iOS交互核心步驟如下:
? ? ? ? ? ? ?1.新建一個Unity3D項目;
? ? ? ? ? ? 2.新建一個iOS項目,新建一個ViewController.m,ViewController.m .h文件并導(dǎo)入Unity3D原始項目的Plugins文件加下(Plugins具體作用,下面會詳細解說),用于與Unity3D交互;
? ? ? ? ? ? ?3.打包成Xcode項目,運行測試。
1.新建一個Unity3D項目并打開。
2.新建一個iOS項目打開,創(chuàng)建繼承于UIViewController的文件,這里我命名為UnityToIOSString。(我們也可以創(chuàng)建繼承于NSObject)
3.在Unity3D項目的Assets文件夾下創(chuàng)建一個Plugins文件夾,再創(chuàng)建一個UnityToIOS文件夾,專門用來放原生代碼文件。把UnityToIOSString文件復(fù)制到UnityToIOS文件夾中。(注:Plugins文件夾用來放native插件。它們會被自動包含進build中去。注意這個文件夾只能是Assets文件夾的直接子目錄。)
4.打包成Xcode項目,接下來就是最關(guān)鍵的地方~~擼代碼?。。。。。?/h4>
1.帶參數(shù)無返回值
第一步:在Xcode項目中找到我們導(dǎo)入的UnityToIOSString文件。編寫交互函數(shù),用來unity調(diào)取。

在Unity C#中都是用調(diào)用C語言函數(shù),而我們在Xcode中編寫代碼,所以我們要加上標準C編寫的Dll函數(shù)。如上圖(別忘了在.h文件中寫函數(shù))。
第二步:在Unity中創(chuàng)建一個封裝類UnityToIOS,引入在Xcode中定義的方法,方法名必須與Xcode一樣。

要引入頭文件usingSystem.Runtime.InteropServices;? 為了[DllImport("__Internal")]。在聲明實現(xiàn)方法的時候要加上修飾符extern,專門給外部調(diào)用的修飾符,與DllImport屬性一起使用,該方法前面必須聲明static。
第三步:在Unity中創(chuàng)建一個事件文本ButtonIOSTest,創(chuàng)建UI事件,調(diào)用封裝方法。

保存后,基本上就完事了。但是這里面有2個小坑。1.我們在Unity中編寫的代碼并沒有在我們導(dǎo)出的Xcode項目中,要重新生成Xcode項目。2.我們在第一步寫的代碼并沒有在Unity中,我們要手動的把代碼復(fù)制會Unity中的UnityToIOSString中(暫時我沒有找到好的方法。如果誰有可以告訴我一聲)。完成這2點之后,我們就要重新Build生成Xcode項目,這里我們最好是Append而不要用Relpace。好了,運行Xcode看效果吧。

2.帶參數(shù)有返回值 -- 原理是一樣的,上圖。(注:有返回值的時候,因為考慮到內(nèi)存管理機制的問題,在回調(diào)的時候哦要加char *MakeStringCopy (const char *string)方法)



PS: 還有無參數(shù)無返回值,無參數(shù)有返回兩種函數(shù),原理一樣。