關于unity導出工程與已有iOS工程合并網上面已經有很多的教程,但是還是要記錄一下自己的經歷過程。從最基本的說明,面對剛接觸unity的小白,力求大家看到過后一次性合并成功。所用unity版本5.3.5p8(沒什么關系),xcode版本7.3.1
再說一遍新版的 unity 和 xcode 不需要刪除下面說的一些文件引用。直接引用就好了,而且好像也沒辦法批量刪除部分文件引用。??(unity 2017版的沒試過)
? ? ? ?看到很多人問我怎么配置不成功啊,這里、那里錯?。我都暈了,現在說一下啊,我上面已經全說了,再配置不成功的話,可以參開我的 配置demo,里面的 unity 文件我已經移除,下載過來以后要按照要求將你的 unity 文件移進去,并修改少量代碼,就可以了,報錯的話下面有部分解決方案。(新版最好直接將之前的文件刪除(刪到垃圾推里),重新添加文件)
配置下載鏈接這個是我的網盤鏈接鏈接,大家可以下載,我也傳到cocoachina 上面了,不過要審核。
1,怎么導出unity的iOS工程
- 1.1首先在unity打開unity工程,然后點擊file->buld setting
- 1.2 然后在彈框出來,如果當前默認不是iOS平臺就切換到iOS平臺。確認平臺以后就點擊player setting按鈕,進入具體的配置界面。
- 1.3 進入具體設置Other Settings,圖上面畫的就是設置的東西,il2cpp這個不要忘了設置,還有運行方式,最低版本支持。設置完成直接building導出。
- 還有一個問題就是游戲開發的時候(雖然我不是做游戲開發的)的可能會碰到關于AOT的問題,其實就是在這個位置設置好就行了,具體的網上都有,直接搜索AOT引起的crash就找得到,雖然沒解決我的問題。
2,開始進行導入工程前的準備
打開unity已經導出的工程,看看里面的庫是否是支持目前版本的庫,然后再運行一下,基本是不會出問題的。如果出現錯誤的話應該是需要把encode設置為no,還有在building setting上設置新的編譯參數
如果unity導出的工程可以完整的在模擬器或者真機上運行,那么這個導出的工程上的配置就是對的,然后可以在需要導到目標工程里面進行copy UNITY里面的設置。
3,開始導入unity工程
- 3.1 在unity導出的工程中,選中這些資源文件,并將其拷貝到目標工程所在目錄
- 3.2然后打開目標工程,開始添加文件引用,添加的方式不一樣,Class和Libraries文件夾用Create Groups,而Data用Create folder.. ,不要選錯
這個大家要注意啊::::!!!!
# Classes 的 Native在移到工程中的時候可能會缺少部分文件,Classes文件從導出的工程復制粘貼到自己的項目會少文件,這個很坑。
新版的的 unity 好像沒有 MapFileParser 這個文件,這沒關系的。
4 添加完成后,開始刪除一部分引用(不是直接刪除啊),后面所有的刪除都是刪除引用。
###(新版本不刪除引用!!!(我后面用的5.5.1f1))
- 4.1先刪除引用libraries里面的libil2cpp文件夾,然后再刪除Classes里面的Native文件夾里面的所有.h文件
?- 4.2然后再將classes里面的main.mm文件內容全部拷到自己原有的main.m文件中再刪除引用,并將AppControllerClassName后面修改成AppDelegate,自己修改 main.m->main.mm。將.pch文件里面的東西放到自己的pch文件中或者就用它的也可以,并添加#import"UnityAppController.h",但是pch文件路徑別忘了添加。
- 4.3如果出現一些運行報錯那就把//UIApplicationMain(argc, argv, nil, [NSString stringWithUTF8String:AppControllerClassName]);替換掉。
- 4.4然后就是點擊工程進入設置界面,主要設置的地方有三個,怎么設置參考導出的unity工程。。。
第一個主要是庫的添加,第二個是一系列的配置,最好要完全copy里面的設置(看清楚瞪大眼睛,里面的引用資源路徑別寫錯了啊)簡略的寫寫,照著unity導出的工程配置就可以了。
第三個是一個run
- 4.5這樣配置完了,command+b編譯時在 UnityAppViewcontroller 里面應該會出現不識別UnityViewControllerBase,把它直接改成UIViewController。
然后在AppDelegate中添加
- 4.6這里寫完后在UnityAppController.h里面修改
5,啟動unity界面了
- 在需要啟動的界面調用
#進入調用。
[(AppDelegate*)[UIApplicationsharedApplication].delegate ?showUnityWindow];//啟動
UnityPause(false);
#退出調用。(退出時用 unity 內部自己寫的腳本調用外部自定義的 C 方法,將下面的代碼放進去。不會的話就去搜!!!)
[(AppDelegate*)[UIApplicationsharedApplication].delegate ?hideUnityWindow];//隱藏
UnityPause(true);
就可以啟動unity了。
添加一個陀螺儀腳本,使用這個腳本后在unity 里面有很棒的效果,制作的 GIF 圖看著有點卡,其實很流暢的哦:
寫到最后終于寫完了,主項目里面的設置要參考unity導出的工程設置。
啟動問題:
因為加載方式的原因,導致APP 整體啟動速度較慢,內存峰值上升較快,所以設置了自己主動觸發 unityController 的啟動。這次改動是將之前在 didFinishLaunching里面的啟動代碼放到 showUnityWindow里面,其他保持不變。目前 unity 資源占用問題讓 unity 工程師做,加載空的 unity 場景增加內存只有15M 左右(已測試,退出時切換到空的場景可以大幅減少占用內存),另外壓縮圖片大小可以大度降低內存占用量。
解決 unity 內存占用問題也可以參考:Unity 3D 內存太大問題解決方案
代碼如下:
報錯問題:
?1,一些 cpp 文件之類的找不到,應該是資源路徑不對,或者文件丟失,去 finder 里面看一哈。
2,Functions that differ only in their return type cannot be overloaded
? ? ? ? 》解決辦法:把Enable Strict Checking of objc_msgSend Calls改為NO
3,__weak typeof(self)wSelf = self報錯:- A parameter list without types is only allowed in a function definition. A corresponding warning tells me that __weak only applies to Objective-C object or block pointer types;type here is 'int'
? ? ?》解決辦法:Xcode-> Build Settings-> C Language Dialect修改配置,C99改為GNU99,C99是不包含typeof的
4,cString報錯
? ? ? 》解決辦法:Setting "Always Search User Paths" to "No" in the project settings fixed the build issues.
5,dyld: Symbol not found: _AbstractEventData_Reset_m15186946類似于這種錯誤
》 1):我是之前融合了簡單的unity導出工程OK的情況下,再次融合新版的導出工程時報的錯誤(我的再次融合方式是,直接替換之前導入的資源文件),可能是工程里面引用到的某個方法或者文件和之前的不同,所以簡單的替換資源文件導致出現的dyld: Symbol not found錯誤情況,大家如果出現這種錯誤可以試試,不需要更改之前的配置,只需要刪除之前老的資源文件(在 xcode 里面刪除引用),重新引入最新的資源文件。
? 》2):可能是一些資源Framework設置不是optional
后期添加的:只能幫到這了,畢竟我也好久沒在做這方面的了。
- 其他整合交互方案看-》www.lxweimin.com/p/db88ffd57168
- 如果遇到動畫消失-》www.lxweimin.com/p/baabd47434ca
- 如果實用 easyAR 遇到黑屏-》www.lxweimin.com/p/f98bcfe09dc7