一:使用 Application.Quit()
public void Update() { if(Input.GetKeyDown(KeyCode.Escape)) Application.Quit(); }
如此,Unity 就能響應 Android 的 Back 按鈕了。
但是!這個方法存在的問題是,退出當前 UnityPlayerActivity 的同時,會退出整個程序。因此對於想返回上一個 Activity 並不有效。
二:添加一個后退的 button 執行 mUnityPlayer.quit()
在 UnityPlayerActivity 類,存在 mUnityPlayer.quit() 方法,通過退出 unityplayer 來結束 UnityPlayerActivity。 於是就考慮在安卓端設置一個后退按鈕如圖:
設置該按鈕的監聽並執行 mUnityPlayer.quit():
bckbtn = (Button) findViewById(R.id.navigate_back); bckbtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mUnityPlayer.quit(); } });
這樣就能退出當前的 UnityPlayerActivity 並返回前一個 Activity 。
三:使用 Unity 調用 Android 響應 Back 按鈕
為了最終實現響應手機的系統按鍵返回前一個 Activity,在這使用到了 Unity 和 Android 的交互,通過 Unity 中的腳本響應系統按鍵,再調用 Android 函數實現返回上一個Activity。關於 Unity 調用 Android 的函數,可參考:http://www.xuanyusong.com/archives/667 。
在此,首先在 Unity 的 C# 腳本中添加如下代碼響應 Back 按鈕:
if (Input.GetKeyUp (KeyCode.Escape)) { AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); jo.Call ("onBackPressed"); }
在此先得到 AndroidJavaClass ,然后得到 AndroidjavaObject 就是當前 UnityPlayerActivity 的對象,拿到它的對象后調用jo.Call()參數表示調用 UnityPlayerActivity 類中的方法名稱。
於是在 UnityPlayerActivity 下實現上面的 onBackPressed() 方法,並在該方法中實現 mUnityPlayer.quit(),那么問題就搞定了,Android 端 java 代碼如下:
@Override public void onBackPressed() { runOnUiThread(new Runnable() { @Override public void run() { mUnityPlayer.quit(); } }); super.onBackPressed(); }
這里重寫了系統的 onBackPressed() 函數。
就此,最終實現了 Unity 響應手機的系統返回鍵,成功返回上一級 Activity。