操作流程
-
使用AndroidStudio创建一个空Android项目
-
导入Unity的jar包(在Unity安装目录下搜索
classes
,随意复制一个到Android项目文件夹的libs目录下) -
添加脚本
package com.company.baseet; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.pm.PackageManager; 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; } //重启应用 public void RestartGame () { Log.i(TAG,"调用Android重启"); PackageManager packageManager = _activity.getPackageManager(); Intent intent = packageManager.getLaunchIntentForPackage(_activity.getPackageName()); ComponentName componentName = intent.getComponent(); Intent mainIntent = Intent.makeRestartActivityTask (componentName); _activity.startActivity(mainIntent); System.exit(0); } //获取Unity实例 private Restart(String gameObject) { this.gameObject = gameObject; try { //这里使用的是导入的unity jar 包中脚本文件 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(); } //获取Unity的Activity 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; } //接受Unity发送的消息 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); } } }
-
打包jar,将jar文件复制到Unity项目中
-
Unity调用脚本
public void ResartApp() { Log.Debug(" ResartApp"); #if UNITY_ANDROID //获取导入的安卓包下的类 AndroidJavaClass jc = new AndroidJavaClass("com.company.baseet.Restart"); //通过类创建对象 AndroidJavaObject jo = jc.CallStatic<AndroidJavaObject>("getInstance", "ResartApp"); //调用对象重启方法 jo.Call("RestartGame"); #else EditorApplication.isPlaying = false; #endif }