前言
在android開發(fā)中钢悲,我們可能希望在現(xiàn)有的android項(xiàng)目中添加對(duì)unity的支持焕阿,以實(shí)現(xiàn)app擁有AR/VR屯烦,3D交互坷随,2D游戲等unity的功能。以下將介紹如何實(shí)現(xiàn)該具體過程驻龟。
正文
本文基于Unity-Technologies/uaal-example項(xiàng)目分析
https://github.com/Unity-Technologies/uaal-example/blob/master/docs/android.md
該文檔介紹利用unity的Build Settings功能下的Export Project温眉,將一個(gè)unity project 導(dǎo)出為Android project, 該Android project目錄下包括了unityLibrary module ,我們只需要按照Android項(xiàng)目如何添加一個(gè)現(xiàn)有module項(xiàng)目到當(dāng)前工程目錄的方式翁狐,最終實(shí)現(xiàn)整合unity工程到我們的項(xiàng)目类溢。
完成后項(xiàng)目目錄如下:
接下來我們?cè)赼ndroid項(xiàng)目中編譯運(yùn)行該app,unity端為獨(dú)立進(jìn)程露懒,見下圖:
閱讀該項(xiàng)目源碼闯冷,發(fā)現(xiàn)android端和unity端的雙端通信方式如下:
android端至unity端:
UnitySendMessage,這是方法我們至少需要傳入兩個(gè)參數(shù)懈词,第一個(gè)參數(shù)為unity中的一個(gè)gameobject名稱蛇耀,第二個(gè)參數(shù)為這個(gè)gameobject身上捆綁的腳本中的一個(gè)方法,而第三參數(shù)事實(shí)上是這個(gè)對(duì)應(yīng)方法上的參數(shù)坎弯。
例子:
mUnityPlayer.UnitySendMessage("Cube", "ChangeColor", "yellow");
unity端至android端:
通過反射機(jī)制纺涤,創(chuàng)建AndroidJavaClass 和AndroidJavaObject實(shí)例調(diào)用android端對(duì)應(yīng)接口。
例子:
#if UNITY_ANDROID
try
{
AndroidJavaClass jc = new AndroidJavaClass("com.company.product.OverrideUnityActivity");
AndroidJavaObject overrideActivity = jc.GetStatic<AndroidJavaObject>("instance");
overrideActivity.Call("showMainActivity", lastStringColor);
} catch(Exception e)
{
appendToText("Exception during showHostMainWindow");
appendToText(e.Message);
}
#elif UNITY_IOS || UNITY_TVOS
NativeAPI.showHostMainWindow(lastStringColor);
#endif
完整閱讀項(xiàng)目源碼抠忘,生成如下類圖:
類圖中unity核心類是UnityPlayerActivity撩炊,andriod app通過啟動(dòng)UnityPlayerActivity進(jìn)入untiy世界。
該類源碼文件位于unity程序安裝目錄下Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player
導(dǎo)出到android項(xiàng)目目錄位于:
UnityPlayerActivity的核心成員變量是UnityPlayer, 該類源代碼無法查看具體實(shí)現(xiàn)褐桌,但是通過查看UnityPlayer.class文件衰抑,我們大致可以了解:
該類繼成自FrameLayout,
類成員變量主要包括:
Context mContext, context相關(guān)接口
SurfaceView類mGlView荧嵌,用于展現(xiàn)UI
NetworkConnectivity類m_NetworkConnectivity 呛踊,監(jiān)聽網(wǎng)絡(luò)變化,
AudioVolumeHandler 控制音量啦撮,
Camera2Wrapper m_Camera2Wrapper 相機(jī)相關(guān)控制
TelephonyManager m_TelephonyManager 網(wǎng)絡(luò)相關(guān)控制
接著查看unity工程目錄下的OverrideUnityActivity谭网,從目錄可以分析Android,iOS等多端平臺(tái)相關(guān)內(nèi)容都在Assets\Plugins下
在Android目錄下添加一個(gè)android aar文件,重新Export Project到Android 工程下赃春,查看build.grandle(Module:unityLibrary), 已自動(dòng)添加了該aar文件的依賴愉择。
總結(jié):
通過學(xué)習(xí)uaal-example源碼,我們知道了
- Android進(jìn)入U(xiǎn)nity世界的橋梁UnityPlayerActivity和UnityPlayer,
- android和unity的通信接口 UnitySendMessage锥涕, 反射方式創(chuàng)建AndroidJavaClass和AndroidJavaObject
- Android和unity多工程跨平臺(tái)項(xiàng)目開發(fā)方式Export Project衷戈,iOS端與此類似,本文不再贅述层坠。
參考:
https://docs.unity3d.com/Manual/UnityasaLibrary-Android.html
https://github.com/Unity-Technologies/uaal-example/blob/master/docs/android.md