Android 與 Unity交互一般是在Unity中做三維場景,然後導出成Android Project,之後在Android中把Unity場景展示出來。
剛接觸這方面的時候必會遇到的問題就是:按Android自帶的back返回鍵不能退出應用。網上搜了很多博客,絕大部分都是調用UnityPlayer中的quit()方法。
那麼我們來看看這個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(h.c()) {
this.removeAllViews();
}
this.kill();
f();
}
quit()方法中倒數第二行this.kill();
protected void kill() {
Process.killProcess(Process.myPid());
}
該方法只有一行代碼:就是殺死當前進程這就是我寫這篇博客的原因,Unity和Android不一樣:
Unity只有一個界面,它改變場景不需要重新創建界面只需要把要顯示的場景在原來的界面中畫出來而已;Android中一個Activity就是一個界面,一個程序中可以有很多Activity。
那麼問題來了:從Android中的一個Activity(比如:MainActivity)跳轉到Unity場景中(一般默認對應的是UnityPlayerActivity),之後從UnityPlayerActivity退出來返回到MainActivity的時候,因爲調用了UnityPlayer的quit()方法而把當前的進程殺死了,之前的MainActivity已經不存在了,你會發現頁面閃了一下還是退到MainActivity頁面了,殊不知這個MainActivity是新創建的。
解決思路:
調用quit方法退出,但不能讓kill()方法執行。
解決方法:
定義一個類MyUnityPlayer繼承UnityPlayer並重寫其kill()方法
public class MyUnityPlayer extends UnityPlayer {
public MyUnityPlayer(ContextWrapper contextWrapper) {
super(contextWrapper);
}
@Override
protected void kill() {}
}
可以看到kill()方法中方法體是空的,這樣就避免了殺死進程的操作。當然了還沒完,我們創建了自己的UnityPlayer我們還沒有使用呢,在UnityPlayerActivity類中有這麼一行代碼:
mUnityPlayer = new UnityPlayer(this);
我們只需要把UnityPlayer換成我們自己的MyUnityPlayer即可。如果添加了對back鍵的處理,建議調用Activity的finish()方法,而不是直接調用UnityPlayer的quit方法,因爲在UnityPlayerActivity的onDestroy()方法中已經調用了quit()方法
// Quit Unity
@Override protected void onDestroy ()
{
mUnityPlayer.quit();
super.onDestroy();
}
這段代碼是Unity導出爲Android Project時自動生成的代碼,我們在back鍵處理的方法中只需要調用finish()方法,其它的還是交由Activity來處理吧!處理後的效果: