最近在公司寫的專案是基於ios與unity3d的,之前也寫了不少的ios與unity的專案,但是這次將兩者結合開發還是第一次。專案的第一條功能需求就是:實現從ios原生介面到unity的跳轉。
看似簡單,但是卻不知道怎麼下手,修改unity匯出到ios的封裝好的**是肯定的,但是至於改**,怎麼改卻是比較難。和一般的coding一樣,一上來先是各種找解決方案和樣例,不管是國內大神雨松momo的部落格,還是牆外的社群都是搜刮了一番,運氣挺好,在某島國的部落格中有人寫了一種解決方案。鏈結戳這裡:
這裡提供的解決方案並沒有給出完整的解釋,原博主也只是一步步教你在**改**,雖然能執行,但是卻不知所以然。而且,這套解決方案有bug,後來才知道:如果沒有處理好viewcontroller與unity之間的關係,會導致跳轉到unity之後出現如下錯誤:
opengles-error-0x0502
然後你的unity介面內容就糊掉了==!
——繼續找,在另外一篇帖子裡面看到了比較完整的另外一種解決方案,鏈結戳這裡:
這篇部落格的教程就是在這兩種解決方案的基礎上進行的。旨在提供一套」你跟著做了就能夠實現」的較為完整的解決方案。當然,前提是我們假設你會unity,ios的一些基礎知識
開發環境
開發語言
先讓了解一下unity build出來的ios工程專案的整個框架以及執行流程
main.mm作為整個專案的入口主要做了如下的事情
const
int main(int argc, char* argv)
所以整個專案看起來就像把unity匯出的工程剖開,將我們自定義的部分」塞」進去,從而實現ios與unity3d的互動。
1.修改專案入口
void unityinittrampoline()
- (id)init
- (void)prestartunity
- (uiwindow*)window
...
執行了startunity,會讓unity的介面就會顯示出來。
如果要修改專案入口,讓unity介面顯示之前先顯示我們需要的介面,就需要
在startunity函式執行之前實現入口修改,當我們需要跳轉到unity部分的時候再呼叫startunity
self
.mydatamanager = [mydatamanager sharedmanager];
//mydatamanager是乙個單例,存放一些全域性變數,用來進行跳轉判斷
if(!self
.mydatamanager
.isinmyhomeview)
else
} **中可以看到,實現修改程式入口的本質就是對window進行修改:
進行這樣的操作,程式就會在啟動後跳轉到我們自定義的view上了。
2.從自定義介面啟動unity
我們已經知道,啟動unity的函式是
那麼在我們自定義的vc中我們就能利用這個方法實現從自定義介面啟動unity:
[self
3.從unity介面返回自定義介面
返回自定義的方法有很多,我這裡用的方法是在當前window的rootview上面加上乙個button來實現跳轉(這部分**同樣是加在自定義的vc中,我這裡的實現思路是在startunity函式呼叫之後就加上按鈕)
uiview *pauseunityview = [[uiview alloc] initwithframe:cgrectmake(10, 25, 40, 40)];
uibutton *backbtn = [[uibutton alloc] initwithframe:cgrectmake(5, 5, 30, 30)];
pauseunityview.backgroundcolor = [uicolor whitecolor];
backbtn.backgroundcolor = [uicolor redcolor];
[backbtn addtarget:self action:@selector(doexitselector) forcontrolevents:uicontroleventtouchdown];
[pauseunityview addsubview:backbtn];
[self
.window
.rootviewcontroller
.view addsubview:pauseunityview];
跳轉實現函式為
- (void)doexitselector
4.從自定義介面跳轉unity
和步驟2不同,在unity跳轉回來後,unity沒有關閉,只是呈現掛起狀態。所以unity介面仍然存在,這也是我們為何在步驟3中需要把unity介面儲存在單例中。這裡我們也只需要再進行一次介面跳轉就能把unity呈現出來:
if(self
.mydatamanger
.isrestartinunity)
self
.window
.rootviewcontroller = self
.mydatamanger
.unityviewcontroller;
[self
.window bringsubviewtofront: self
.mydatamanger
.unityviewcontroller
.view];//把unityview放到最前面
[[[unitygetmainwindow() rootviewcontroller] view]sethidden:no];
[unitygetmainwindow() makekeyandvisible];
unitypause(false);//取消暫停
}
至此,ios與unity3d的互動就在這四個步驟中實現。說到底並不難,主要搞懂了幾個介面的關係以及ios的window,rootview的層級結構就行。
專案檔案
有任何問題及不足請指出
unity3D 搞定任意ios外掛程式
說起unity調ios外掛程式,好多淫比較頭痛,探索再此給大家獻上通用手冊。首先 需要需要一些oc知識,在oc中所有的介面都是基於view顯示的,而要使用第三方提供的ios sdk 僅需簡單修改源 把相應view新增到unity build出來的xcode工程的根view上即可。也許有人在罵,這不廢...
unity3D 搞定任意ios外掛程式
說起unity調ios外掛程式,好多淫比較頭痛,探索再此給大家獻上通用手冊。首先 需要需要一些oc知識,在oc中所有的介面都是基於view顯示的,而要使用第三方提供的ios sdk 僅需簡單修改源 把相應view新增到unity build出來的xcode工程的根view上即可。也許有人在罵,這不廢...
Unity3D開發(九) Unity3d流光效果
遊戲開 壇 hello game 遊戲開發群 201276069 之前曾經注意過material 中紋理的屬性都有 tiling 和offset 但沒有深究過其用途,今天才知道竟然可以利用 offset做uv 動畫,從而完成各種有趣的動畫,比如流光效果!流過效果即通常一條高光光在物體上劃過,模擬高光...