iOS與Unity3d的互動實現

2021-07-09 01:45:38 字數 3155 閱讀 1302

最近在公司寫的專案是基於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 動畫,從而完成各種有趣的動畫,比如流光效果!流過效果即通常一條高光光在物體上劃過,模擬高光...