Android Unity3D 相互交互,及退出繼承UnityPlayerActivity的Crash問題

這是我第一次寫博文鸠真,只是我做過項目的一些技術(shù)點悯仙,也就相當于自己的筆記,希望能對看到文章的你有用吠卷。
公司項目比較多使用AR锡垄,一般我們都是使用第三方SDK,使用的EasyAR祭隔。它有兩種方式來實現(xiàn)AR功能货岭,第一種是用JNI,使用NDK(自行百度google查找相關(guān)技術(shù)文章)疾渴,第二種是Android和Unity3D的交互千贯,Ar圖形,模型視頻等由Unity3D來完成搞坝,Android來處理 加載創(chuàng)建 掃描 脫卡等事件處理(著重講這部分)搔谴。

Unity導出的項目:

我記錄Android這部分的操作 不記錄Unity3D的
首先你要讓Unity的工程師導出一份Android項目給你,當然導出的AS項目(我沒用過Eclipse的方式)

Unity導出項目結(jié)構(gòu).png

lib文件下面是要使用的Jar包
src中包括了assets,jniLibs和java文件夾下的UnityPlayerActivity,UnityPlayerNativeActivity,UnityPlayerProxyActivity.建議使用UnityPlayerActivity.java桩撮,assets文件中是unity的一些資源文件敦第,包括了場景和渲染的一些文件峰弹,jniLibs當然是所用到的.so文件了

  • 如果你已經(jīng)有Android的工程項目了,此時你只需要把assets的文件和lib中的文件芜果,和jniLibs的文件拷貝到你的項目中去鞠呈,然后把需要配置的類和權(quán)限在AndroidManifest.xml中配置一下(EasyAR需要用到攝像頭的權(quán)限,在6.0以上的版本也無需去申請權(quán)限右钾,SDK中有集成了蚁吝。如果你不放心 可以再去申請)
  • 沒有項目,那么只需要把unity的導出項目直接導入到你的Android Studio中即可舀射。
    下面就是我導入完成后的項目結(jié)構(gòu)圖
項目結(jié)構(gòu).png

ArMapActivity的布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- unity3d layout -->
    <LinearLayout
        android:id="@+id/layout_unity"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    </LinearLayout>
    <!-- 這邊可以加入覆蓋到unity的layout -->
 </FrameLayout>
先介紹一下 兩者之間的調(diào)用方法的方式:
Android調(diào)用Unity的方法

UnityPlayer.UnitySendMessage("ImageTargetManager", "LoadNativeAssetBundle", json);

  • 第一個參數(shù)"ImageTargetManager"是Unity Object對象灭将,需要在Unity對象上綁定腳本】
  • 第二個參數(shù)"LoadNativeAssetBundle"是Unity 中定義的方法名 (這兩個都是Unity工程師會提供給你的)
  • 第三個參數(shù)是定義方法的參數(shù)(可空)。
Unity調(diào)用Android的方法

先在Android自定義一個方法

Android代碼
 /**
   * Unity調(diào)用此方法并把參數(shù)jsonString 調(diào)用給Android
   * @param jsonString
   */
 public void Unity3DSendMessage(String jsonString) {
        Log.i("TAG", "[Unity3DSendMessage] " + jsonString);
        final JsonRetrun entity = new Gson().fromJson(jsonString, JsonRetrun.class);
        switch (entity.getActionName()) {
            case "sceneLoaded":
                break;
            case "loadModelAssetCompleted":
                break;
            case "imageTargetBound":
                break;
            case "imageTargetBoundFail":
                break;
            case "TargetFound":
                break;
            case "TargetLost":
                break;
            default:
                break;
        }
    }
Unity代碼
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("ArMapActivity");
jo.Call ("Unity3DSendMessage","");

jo.call(String str1,String str2);第一個參數(shù)是Android的方法名后控,第二個參數(shù)是傳遞給Android的參數(shù)

到這邊已經(jīng)把Android交互Unity的方法方式介紹完成了

發(fā)現(xiàn)的一個坑

當你使用玩AR時 點擊系統(tǒng)返回或者是自定義的ImageButton返回時, 如果你調(diào)用的是onDestroy方法空镜,你會發(fā)現(xiàn)應(yīng)用出現(xiàn)了Crash浩淘,如果你單單在點擊事件中 finish();該Activity,也會出現(xiàn)Crash吴攒。
UnityPlayerActivity中onDestory方法是這么寫的

@Override  
protected void onDestroy()  
{  
       mUnityPlayer.quit();  
       super.onDestroy();          
}  

這樣寫 會使后面的代碼不執(zhí)行了张抄,從而造成Crash
對mUnityPlayer.quit()方法的反編譯之后 發(fā)現(xiàn)quit方法是這樣的

public void quit() {
    this.k = true;
    if(!this.e.e()) {
        this.pause();
    }

    this.a.a();

    try {
        this.a.join(4000L);
    } catch (InterruptedException var1) {
        this.a.interrupt();
    }

    if(this.g != null) {
        this.h.unregisterReceiver(this.g);
    }

    this.g = null;
    if(l.c()) {
        this.removeAllViews();
    }

    if(i.b) {
        i.g.a(this.h);
    }

    this.kill();
    h();
}

注意倒數(shù)第二行的this.kill()方法,不看實現(xiàn)可以猜出應(yīng)該是殺進程的洼怔。所以...

我google百度了不少時間發(fā)現(xiàn)了 可以在該Activity的AndroidManifest.xml中設(shè)置一個新的進程署惯。這樣,就不會影響你本身項目的進程

AndroidManifest設(shè)置.png

這樣設(shè)置之后镣隶,雖然解決了不會崩潰問題极谊,但是有時候退出Activity時會卡住一段時間。
我在搜索mUnityPlayer.quit()的時候還看到別人針對這個問題做了另外一種解決安岂,就是重寫UnityPlayer類的kill方法(就是上面提到的kill方法轻猖,然后再去調(diào)用自己重寫的方法即可
重寫的例子如下:

public class MyUnityPlayer extends UnityPlayer {

    public MyUnityPlayer(ContextWrapper contextWrapper) {
        super(contextWrapper);
    }

    //不執(zhí)行父類的方法
    @Override
    protected void kill() {

    }
}

然后在有Unity的ArMapActivity中

@Override  
protected void onCreate(Bundle savedInstanceState)  
    {  
      super.onCreate(savedInstanceState);  
      mUnityPlayer = new MyUnityPlayer(this); 
      layoutUnity.addView(mUnityPlayer);
      mUnityPlayer.requestFocus();
    }  

這樣子,就能解決退出Activity不Crash域那,并且響應(yīng)速度也比較快咙边。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市次员,隨后出現(xiàn)的幾起案子败许,更是在濱河造成了極大的恐慌,老刑警劉巖淑蔚,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件市殷,死亡現(xiàn)場離奇詭異,居然都是意外死亡束倍,警方通過查閱死者的電腦和手機被丧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門盟戏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甥桂,你說我怎么就攤上這事柿究。” “怎么了黄选?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵蝇摸,是天一觀的道長。 經(jīng)常有香客問我办陷,道長貌夕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任民镜,我火速辦了婚禮啡专,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘制圈。我一直安慰自己们童,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布鲸鹦。 她就那樣靜靜地躺著慧库,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馋嗜。 梳的紋絲不亂的頭發(fā)上齐板,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音葛菇,去河邊找鬼甘磨。 笑死,一個胖子當著我的面吹牛眯停,可吹牛的內(nèi)容都是我干的宽档。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼庵朝,長吁一口氣:“原來是場噩夢啊……” “哼吗冤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起九府,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤椎瘟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后侄旬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肺蔚,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年儡羔,在試婚紗的時候發(fā)現(xiàn)自己被綠了宣羊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片璧诵。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仇冯,靈堂內(nèi)的尸體忽然破棺而出之宿,到底是詐尸還是另有隱情,我是刑警寧澤苛坚,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布比被,位于F島的核電站,受9級特大地震影響泼舱,放射性物質(zhì)發(fā)生泄漏等缀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一娇昙、第九天 我趴在偏房一處隱蔽的房頂上張望尺迂。 院中可真熱鬧,春花似錦冒掌、人聲如沸枪狂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辜限,卻和暖如春皇拣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背薄嫡。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工氧急, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毫深。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓吩坝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哑蔫。 傳聞我的和親對象是個殘疾皇子钉寝,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評論 25 707
  • 現(xiàn)在android開發(fā)都轉(zhuǎn)到android studio上了, unity與android交互闸迷,如unity打開a...
    菲得更高閱讀 7,611評論 2 13
  • 《騰訊桌球:客戶端總結(jié)》 本次分享總結(jié)嵌纲,起源于騰訊桌球項目,但是不僅僅限于項目本身腥沽。雖然基于Unity3D逮走,很多東...
    吳秦閱讀 24,463評論 12 142
  • 2017年11月7日 晴 今天又是星期天,我七點起床今阳,看到外面的天氣很好师溅,因為蒲公英和我們廈門路小學一起參...
    耿浩然媽媽閱讀 247評論 1 8
  • Growing:早上的商務(wù)英語閱讀課老師讓我們翻譯一個產(chǎn)品的說明書茅信,而且盡量不要翻詞典,第一次做墓臭!很有趣蘸鲸,平時也會...
    柔和謙卑閱讀 163評論 0 1