Android下重啟Unity3d開發的游戲


前面項目中遇到一個問題,就是游戲更新完成之后重啟游戲,按理說這個在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里面怎么放插件啊這些都不用說了吧!網上一大堆的教程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM