簡單說就是 1.先編寫Android 項目 其中要引入 unity的接口文件,讓他們可以互相調(diào)用。
2.Android 項目中 主的activity 它是在AndroidManifest.xml中配置的。它需要繼承UnityPlayerActivity 這樣unity一啟動就會調(diào)起這個Activity
3.然后出jar包 導(dǎo)入到unity項目的中的plugin文件夾
4。 unity中用AndroidJavaClass 來直接調(diào)用Android的接口。
Unity與Android交互有多種方式,使用AndroidJavaClass和AndroidJavaObject是最為方便的方式,這里只介紹此種方式
一般的 用法 也主要是Unity掉Android 所有基本夠用
Unity程序
- 正常創(chuàng)建Unity工程
- 在Unity目錄里創(chuàng)建如下Plugins目錄結(jié)構(gòu),并將建立好的jar文件導(dǎo)入到unity中,如使用到android中的資源文件,要把相關(guān)資源文件也拷貝的對應(yīng)的目錄下。(manifest文件一定要拷貝過來。)
public static AndroidJavaClass mBluetooth;
public static AndroidJavaObject mContext;
mBluetooth = new AndroidJavaClass("com.wangwang.test.mActivity");
using (AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
mContext = cls_UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); //獲取Android工程中繼承UnityPlayer的類的實例
}
- AndroidJavaClass可以用來調(diào)用靜態(tài)方法,AndroidJavaObject可以用來調(diào)用非靜態(tài)方法,例如:
//調(diào)用獲取到的實例中的方法。java中返回的參數(shù)類型用泛型來表示,第一個參數(shù)為java中對應(yīng)的方法名,后面的參數(shù)為要傳入該java方法的參數(shù)。
mContext.Call<bool>("changeServiceState","test");
mBluetooth.CallStatic<bool>("showToast",str , time); //調(diào)用類中的靜態(tài)方法
最佳實踐
- 使用using方法可以減少一些不必要的內(nèi)內(nèi)存開銷,如:
//cls_UnityPlayer 在使用后會被銷毀
using (AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
mContext = cls_UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
}
java中繼承UnityPlayer的類中需要Content的地方最好都使用UnityPlayer.currentActivity,不然可能會出現(xiàn)莫名其妙的錯誤
Unity中的android相關(guān)的配置 Bundle Identifier* 可能需要該為java中項目對應(yīng)的包名。
其實還可以Android調(diào)用起Unity的項目 類似現(xiàn)在的各種VR實現(xiàn)。之間貼文章
http://www.itdecent.cn/p/60d5b9c1b400
https://www.imooc.com/article/68624
http://www.xuanyusong.com/archives/667
Android 里Mainfast.xml 是非常重要的文件,他在程序開始運行時 便調(diào)用。
里面聲明了程序會用到的所有Activity(一個界面就是一個Activity,原生程序不同的界面切換其實是不同的activity)
unity程序是一個整體的Activity就只有一個Activity 切記要聲明里面有l(wèi)unach、icon、application等等
**AndroidManifest:里面還記錄著應(yīng)用程序的權(quán)限,Service啊什么的**
還有各種需要調(diào)用的SDK 。
還有一些必要的聲明文件
Unity在接渠道的時候要注意包名
在Java寫完之后,
每次打包時要確保你的AndroidMainfest 是最新的。
每次打包的時候Unity會用它默認(rèn)的AndroidManifest,它默認(rèn)的AndroidManifest在 unity.app/Contents/PlaybackEngines/AndroidPlayer下面。當(dāng)你在進(jìn)行打包apk的時候 unity會拷貝該路徑下的所有參數(shù)。
在ProjectSetting里面勾選一些權(quán)限的時候,Unity會自動幫你修改AndroidManifest里面的權(quán)限,但是如果某個權(quán)限不能在Unity工程里面修改,那么就需要自己手動替換。如下圖所示,我們把AndroidManifest放在Plugins/Android下面, 這樣Unity在進(jìn)行打包的時候就不會用它默認(rèn)的,而是用我自己新寫的打包。。這樣就方便靈活很多了。。
bin:下面就記錄著sdk用到的第三方j(luò)ar
res:下面就是安卓的一些圖片,資源啊什么。
在java程序中 導(dǎo)出時需要選擇 src 和gen文件下的內(nèi)容 別的可以不選 但是libs如果有調(diào)用別的sdk需要打包進(jìn)去。但是一定要選擇classPath 和project 里面保存的索引路徑。
在打包時應(yīng)該注意 包名 com.xx.xx.xx 和Defines平臺的聲明 和服務(wù)器的聲明
雨凇的這篇帖子可以看一下http://www.xuanyusong.com/archives/2748
http://www.cnblogs.com/wanqieddy/p/4447594.html
[http://blog.csdn.net/bigconvience/article/details/30063995](http://blog.csdn.net/bigconvience/article/details/30063995)