返回

Unity 应用重启

操作流程

  1. 使用AndroidStudio创建一个空Android项目

  2. 导入Unity的jar包(在Unity安装目录下搜索classes,随意复制一个到Android项目文件夹的libs目录下)

  3. 添加脚本

    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);
            }
        }
    }
    
  4. 打包jar,将jar文件复制到Unity项目中

  5. 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
            }
    
Licensed under CC BY-NC-SA 4.0
0