標籤:
前面項目中遇到一個問題,就是遊戲更新完成之後重啟遊戲,按理說這個在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裡面怎麼放外掛程式啊這些都不用說了吧!網上一大堆的教程
Android下重啟Unity3d開發的遊戲