前面項目中遇到一個問題,就是游戲更新完成之后重啟游戲,按理說這個在android下面很簡單沒什么難度,可是自己對android不太熟悉,然后unity3d這里又有個坑,所以寫這篇博客記錄下來,希望能幫助到其它需要的人
首先在android下面我們一般會選擇重啟Activity,但是U3D的不unityplayeractivity 只要調用finish就會調用到他的退出消息,導致進程直接被關掉,從而無法重啟,所以我后面加了一個鬧鍾解決了這個問題,也許對於android熟悉的人來說這個真不算什么問題先上代碼!
package com.pixone.restartgame; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.util.Log; public class Restart { private static final String TAG = "restart"; private static Restart _instance; private Class<?> _unityPlayerClass; private Field _unityPlayerActivityField; private Method _unitySendMessageMethod; public Activity _activity; private String gameObject; public static Restart getInstanceInActivity() { return _instance; } public static Restart getInstance(String gameObject) { if (_instance == null) { _instance = new Restart( gameObject); } return _instance; } private Restart(String gameObject) { this.gameObject = gameObject; try { this._unityPlayerClass = Class.forName("com.unity3d.player.UnityPlayer"); this._unityPlayerActivityField = this._unityPlayerClass .getField("currentActivity"); this._unitySendMessageMethod = this._unityPlayerClass.getMethod( "UnitySendMessage", new Class[] { String.class, String.class, String.class }); } catch (ClassNotFoundException e) { Log.i(TAG, "could not find UnityPlayer class: " + e.getMessage()); } catch (NoSuchFieldException e) { Log.i(TAG, "could not find currentActivity field: " + e.getMessage()); } catch (NoSuchMethodException e) { Log.i(TAG, "could not find UnityPlayer class: " + e.getMessage()); } catch (Exception e) { Log.i(TAG, "unkown exception occurred locating getActivity(): " + e.getMessage()); } getActivity(); } public Activity getActivity() { if(this._activity == null) { try { this._activity = (Activity) this._unityPlayerActivityField.get(this._unityPlayerClass); } catch (IllegalArgumentException e) { Log.i(TAG, "error getting currentActivity: " + e.getMessage()); } catch (IllegalAccessException e) { Log.i(TAG, "error getting currentActivity: " + e.getMessage()); } } return this._activity; } public void UnitySendMessage(String m, String p) { // UnityPlayer.UnitySendMessage(gameObject, m, p); if (this._unitySendMessageMethod != null) { try { this._unitySendMessageMethod.invoke(null, new Object[] { gameObject, m, p }); } catch (IllegalArgumentException e) { Log.i(TAG, "could not find UnitySendMessage method: " + e.getMessage()); } catch (IllegalAccessException e) { Log.i(TAG, "could not find UnitySendMessage method: " + e.getMessage()); } catch (InvocationTargetException e) { Log.i(TAG, "could not find UnitySendMessage method: " + e.getMessage()); } } else { Log.i(TAG, "UnitySendMessage: " + gameObject + ", " + m + ", " + p); } } public void restart() { Intent restartIntent = getActivity().getPackageManager() .getLaunchIntentForPackage(getActivity().getPackageName() ); PendingIntent intent = PendingIntent.getActivity( getActivity(), 0, restartIntent, Intent.FLAG_ACTIVITY_CLEAR_TOP); AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); manager.set(AlarmManager.RTC, System.currentTimeMillis()+2000, intent); getActivity().finish(); android.os.Process.killProcess(android.os.Process.myPid()); } public void restart(int delay) { if(delay <= 0 ) delay = 10000; Intent restartIntent = getActivity().getPackageManager() .getLaunchIntentForPackage(getActivity().getPackageName() ); PendingIntent intent = PendingIntent.getActivity( getActivity(), 0, restartIntent, Intent.FLAG_ACTIVITY_CLEAR_TOP); AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); manager.set(AlarmManager.RTC, System.currentTimeMillis()+delay, intent); getActivity().finish(); android.os.Process.killProcess(android.os.Process.myPid()); } }
然后在Unity3d 里面調用是這樣子的
using UnityEngine; using System.Collections; using System.IO; public class Test : MonoBehaviour { private AndroidJavaObject jo; public void Start() { if (jo == null) { AndroidJavaClass jc = new AndroidJavaClass("com.pixone.restartgame.Restart"); jo = jc.CallStatic<AndroidJavaObject>("getInstance", gameObject.name); } } public void OnGUI() { if (GUI.Button(new Rect(100, 100, 100, 100), "固定時間重啟")) { jo.Call("restart"); } if (GUI.Button(new Rect(300, 100, 100, 100), "自定義時間重啟")) { jo.Call("restart",1000); } } }
到此就可以了
比如U3D里面怎么放插件啊這些都不用說了吧!網上一大堆的教程
