Android下重啟Unity3d開發的遊戲

來源:互聯網
上載者:User

標籤:

前面項目中遇到一個問題,就是遊戲更新完成之後重啟遊戲,按理說這個在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開發的遊戲

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.