本文屬于「Unity與iOS剖毯、Android平臺(tái)的整合」系列文章之一,轉(zhuǎn)載請(qǐng)注明出處教馆。
本文主要講解Unity與iOS逊谋、Android平臺(tái)進(jìn)行交互的理論基礎(chǔ)。
零土铺、前言
在Unity端使用的是C#
在iOS端使用的是OC
在Android端使用的是Java
你要問(wèn)我為什么胶滋?
因?yàn)槲覙?lè)意啊~
一板鬓、交互需求
代碼與代碼之間的交互需求抽象之后是兩個(gè)最基礎(chǔ)的要求:
1.調(diào)用函數(shù)
2.傳遞數(shù)據(jù)
所以我們只需要在Unity與iOS、Android之間實(shí)現(xiàn)這兩個(gè)基礎(chǔ)要求即可究恤。
二俭令、交互原理
首先,能否實(shí)現(xiàn)交互的基石——互相調(diào)用部宿?
很幸運(yùn)抄腔,Unity主動(dòng)調(diào)用iOS、Android是可行的理张,iOS赫蛇、Android主動(dòng)調(diào)用Unity也是可行的。
1.Unity主動(dòng)調(diào)用iOS雾叭、Android
Unity -> iOS
實(shí)現(xiàn)方案Unity的官方文檔已經(jīng)給出了
我自己做了一些總結(jié):第一棍掐,Unity是支持 C# 通過(guò)調(diào)用DLL的方式來(lái)調(diào)用 C++ 的
第二,iOS是支持 C++ 和 OC混編的拷况,所以 C++ 自然可以調(diào)用 OC
所以作煌,我們的實(shí)現(xiàn)方案為 C# -> C++ -> OC
Unity -> Android
同樣,實(shí)現(xiàn)方案Unity的官方文檔也已經(jīng)給出了
文檔中給出了兩種方法:Plan A:使用Android NDK的方式
Plan B:使用Java Native Interface (JNI)的方式
之后我將講解Plan B中的JNI方式
關(guān)于JNI的方式官方給了詳細(xì)的示例赚瘦,我自己也做了一些總結(jié):
第一粟誓,Unity提供了UnityEngine.AndroidJNI,可以實(shí)現(xiàn)在C#創(chuàng)建Java對(duì)象并調(diào)用函數(shù)
第二起意,在Android下做原生的Java調(diào)用Java實(shí)現(xiàn)不了的可以自掛東南枝了
所以鹰服,我們的實(shí)現(xiàn)方案為 C# -> Java
2.iOS、Android主動(dòng)調(diào)用Unity
iOS -> Unity 揽咕、 Android -> Unity
Unity都只為我們提供了一個(gè)官方的方法
UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");
解釋一下這個(gè)函數(shù):
返回值:無(wú)
函數(shù)類型:靜態(tài)函數(shù)悲酷,直接調(diào)用即可(Java中包含在com.unity3d.player.UnityPlayer中)
參數(shù)1:場(chǎng)景內(nèi)某GameObject物體的名稱
參數(shù)2:該GameObject物體上組件所掛載的函數(shù)名
參數(shù)3:調(diào)用該函數(shù)時(shí)傳入的參數(shù)
所以,我們的實(shí)現(xiàn)方案為 Java/OC -> C#
其次亲善,能否實(shí)現(xiàn)參數(shù)傳遞设易?
不用擔(dān)心,在上面提到的方法都可以實(shí)現(xiàn)蛹头。
1.Unity向iOS顿肺、Android傳遞參數(shù)
a.參數(shù)個(gè)數(shù)
關(guān)于個(gè)數(shù)的話,我最多傳過(guò)9個(gè)渣蜗,上限沒(méi)試過(guò)屠尊,但我也不建議傳太多參數(shù),簡(jiǎn)單點(diǎn)好耕拷。
b.能直接傳遞的類型
我沒(méi)有把所有類型都試一遍讼昆,只總結(jié)了一些常用的,如果有興趣可以自己嘗試一下骚烧。
√:bool浸赫、int嫌吠、float、string
×:class掺炭、struct
c.調(diào)用后的返回值
同樣,我只嘗試了些常用的類型凭戴。
√:bool涧狮、int、float么夫、string
×:class者冤、struct
2.iOS、Android向Unity傳遞參數(shù)
a.參數(shù)個(gè)數(shù)
只有1個(gè)
b.能直接傳遞的類型
只能傳string
c.調(diào)用后的返回值
沒(méi)有返回值
QA
Q:臥槽档痪,這怎么辦涉枫,iOS、Android向Unity只能傳一個(gè)字符串案T柑!@种健衬廷!
A:慌什么,騷年汽绢,知道什么叫Json嗎吗跋?
是的,所有數(shù)據(jù)結(jié)構(gòu)宁昭,我們都可以用Json格式來(lái)封裝成一個(gè)字符串跌宛,傳到C#后再解析出來(lái)就好了。
Q:那沒(méi)有返回值怎么辦积仗,我想要返回值敖小!<挪堋入问!
A:在被調(diào)用的C#函數(shù)內(nèi)回調(diào)一下傳個(gè)參不就好了~
是的,只要能夠?qū)崿F(xiàn)相互調(diào)用傳參稀颁,就可以通過(guò)立即回調(diào)的方式給出返回值芬失,雖然麻煩一點(diǎn)。
三匾灶、總結(jié)
從上文的理論可以看出棱烂,Unity與iOS、Android平臺(tái)之間可以實(shí)現(xiàn)必須的交互需求:
1.調(diào)用函數(shù)
2.傳遞數(shù)據(jù)
所以阶女,Unity與iOS颊糜、Android平臺(tái)之間的交互是可以做的~
同時(shí)哩治,理論的實(shí)現(xiàn)方案在官方文檔中均已給出,希望大家有時(shí)間可以自己嘗試實(shí)現(xiàn)衬鱼。