Unity和Android之間的通信

簡單說就是 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

兩篇參考文章
http://wangwanggame.com/2014/03/27/unity/unity-%E8%B0%83%E7%94%A8android%E4%B8%AD%E7%9A%84java%E4%BB%A3%E7%A0%81/

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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容