unity版本:unity 5.4.3f1?
xcode版本:xcode 8
一、導出unity項目
1.File->Build Settings->ios->Switch platform 切換為iOS平臺,
2.player Settings.....(這個地方設置錯誤會導致導入ios工程之后出現200+錯誤)
3.File->Build Settings->Build(保存為xcode文件)
--------我是分割線------------
二、合并unity項目(2種方式,一是把你的工程集成到unity項目,二是把unity項目集成至你的工程)
(一),將原工程集成至unity工程
1,將原工程直接拖拽到Unity生成的工程里,在Unity的工程上進行開發。
2,將原工程的main.m文件、AppDelegate.h和AppDelegate.m文件刪除,若有pch文件,也可與Unity工程中的Pch文件合并后刪除(刪除相關文件前請先備份,合并后請檢查pch路徑是否正確)。
3,此時程序的主函數入口為Classes/main.mm,AppDelegate為Classes/UnityAppController.mm,程序的pch文件為Classes/Prefix.pch。將原工程的相應代碼拷貝到相對應的文件中即可。
4,因為現在程序的入口在Unity工程端,所以原工程的主界面需在Unity工程運行后(如下圖,“showGameUI”方法調用之后)再添加到keyWindow上即可。
(二),將unity項目集成至原工程
1,將unity與iOS工程放置與同一根目錄,將Unity工程中的`Classes`、`Data`和`Libraries`、‘MapFileParser.sh’文件夾復制到自己的工程根目錄。
2,添加文件,Data 選擇Create folder references,Classes和Libraries 選擇Create groups。
3,在Build settings中設置Pch文件(如工程已有pch文件,請將兩個pch文件合并)。我的做法是,復制unity ?Classes中Pch文件中的代碼添加至自己的Pch文件中,刪除classes中的Pch文件
4.復制Classes中的main.mm文件中的代碼,刪除你的main.m中的代碼,粘貼過去,刪除main.mm,修改main.m為main.mm;
5,在Build Phases新建運行腳本語句Run Script
rm -rf "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Data"
cp -Rf "$PROJECT_DIR/Data" "$TARGET_BUILD_DIR/$PRODUCT_NAME.app/Data"
6.在Build settings中設置Header Search Paths?
$(SRCROOT)/Libraries/libil2cpp/include
$(SRCROOT)/Libraries/bdwgc/include
$(SRCROOT)/Classes/Native
"$(SRCROOT)/Classes"
7,在Build settings中設置Other C Flags
-mno-thumb
-DINIT_SCRIPTING_BACKEND=1
8,在Build Phases中導入以下庫(這里具體請查看導出的ios工程里面的庫,千萬不要重復導入)
9,在Build Phases中將所有.mm文件(除了CameraCapture.mm,MetalHelper.mm,DisplayManager.mm文件)打上MRC標簽。
10.編譯真機運行(此時運行項目進入unity界面)
-------------------我是分割線----------------
三、在iOS工程中打開unity項目 ,(我們項目的入口為main.mm,main函數之后調用UnityAppController.mm,也就是以前項目的AppDelegate.m文件不調用,可以刪除)
1.修改工程啟動方式,由先啟動unity視圖,修改為先啟動我們的ViewController
我們加入了一個myPageEnable變量,表示我們的myPage是否被啟動過,如果啟動做,就不再重復執行,注釋掉startUnity: 改為myPageEnable:如下圖。(此時,運行項目會進入我們自己的界面)
我用單利保存了當前的application 和當前的self,(用于以后點擊按鈕進入unity)
這樣,我們就實現工程直接先啟動我們的視圖,其實總結一下很簡單,把APP的rootViewController修改成我們的,并且停用原有Unity的相同功能代碼。
2.在iOS中打開unity界面
首先,unity一旦被打開,我們是不需要徹底關閉掉的,當從unity返回我們的View 時,將unity view暫停到后臺,并把window的rootviewcontroller設置為我們的rootViewController
我們已經知道,啟動Unity的函數是
- (void)startUnity:(UIApplication *)application,所以重新調用這個函數即可
在我們的控制器里面點擊按鈕(redpacketButton是紅包按鈕)打開unity:
注意一點,startUnity方法只能使用一次。多次調用同樣會導致應用Crash,并報錯:“should not be reached at domain.c”,所以我們用restartUnity(這個方法寫在UnityAppController.mm中)
3.關閉unity界面(這里有兩種方法,一,調用unity中的back函數。二,我們自己寫退出按鈕)
值得注意的是:在extern "C"中,不能用OC的self和self.window獲取到appController和window,必須使用UnityAppController對象提供的方法GetAppController()和UnityGetGLView()來獲取。
3.1, 調用unity中的back函數(這個函數應和unity開發人員溝通,統一命名),調用方法:
extern "C"? void back(){
//你的代碼
}
3.2 自己寫退出按鈕
Unity View啟動時在頁面中初始化一個我們實現寫好的關閉按鈕的UIView,按鈕點擊事件方法和上面一樣
-------------------我是分割線----------------
四。Unity與iOS傳值
4.1 iOS發消息給unity
// 添加這句代碼,它負責向Unity傳遞參數;(具體參數和unity開發人員協商)
extern void UnitySendMessage(const char *, const char *, const char *);
IOS調用Unity函數需要用到UnitySendMessage方法,方法中有三個參數
UnitySendMessage("gameobject", "Method",msg);
參數一為unity腳本掛載的gameobject(可以理解為具體的unity中某個對象或者物體)
參數二為unity腳本中要調用的方法名
參數三為傳遞的數據,注意:傳遞的數據只能是char *類型
4.2 unity向iOS 傳值,這個我沒有用到,大家可以google ?網上案例很多。
結語
實用公眾號: 啊帥科技分享。免費蘋果id,軟件,小飛機等。
最近公司開發AR紅包,寫出這個博客給大家作為參考。因為是初步接觸unity,自己也翻越了很多資料,如果有錯誤,希望大家指正。后期會不斷更新補全集成中遇到的各種問題。
有疑問可以給我發郵件(或者QQ),看到了必定回復:1020351736@qq.com?
QQ群號:129018636