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里面怎么放插件啊这些都不用说了吧!网上一大堆的教程

时间: 2024-10-26 19:01:55

Android下重启Unity3d开发的游戏的相关文章

android下调试unity3d应用

原地址:http://blog.csdn.net/armoonwei/article/details/7032455 目前貌似不支持断点调试,但可以通过日志打印(logcat)来跟踪. 在android SDK中有个adb工具,使用此工具来跟踪运行的android应用: adb logcat 启动logcat,并将设备上运行的android应用的运行时信息全部打印出来. adb logcat -s Unity 如果只想打印Unity的输出信息,使用此命令. adb logcat -d > log

浅析:Unity3D开发的游戏如何降低包体大小

众所周知,通过Unity3D开发的手游包体普遍偏大,动则几百M的安装包,而包体大则会导致手游推广的成本增大,也会影响到用户转化率.除去其他因素,用户在选择下载时,会着重关注游戏包体大小,游戏包体体积过大,下载时间长,会让用户取消下载,同时也会考虑到流量的问题. 因此Unity官方也介绍了几种降低包体大小的方法: 1.替换jpg,使用psd,减少重复资源 2.剔除不必要的资源 3.打包时查看log纪录,由此判断需要减少的文件类型 4.优化,压缩图片,减少图片大小 5.优化,压缩网格和动画,减少文件

U3d学习-使用Unity3D开发2D游戏(上)

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 1.创建一个Unity3D项目 2.将Camera设置为正交投影 游戏的输出画面是通过摄像机所观察的场景来实现的,将场景呈现到2D的计算机屏幕上具有两种不同的投影方式:透视投影和正交投影,默认状态下是透视投影. 透视投影 正交投影 3.添加相关对象模型 移动摄像机物

Android下百度地图开发(一):基础地图展示

最终效果如: 这个需要详细说下,准备工作较为繁琐. 第一步:去百度申请一个开发者账号,新建一个android应用,会让你输入开发者SHA1,目前我只拿到开发版SHA1,发布版那里也填的是这个. 获取方法如: 在C:\Users\Administrator\.android下面呼出命令行,输入 keytool -list -v -keystore debug.keystore,会得到三种指纹证书,选取SHA1类型的证书(密钥口令是android) 红线地方就是,填进adroid sdk申请界面,会

SQL学习笔记之数据库专题(二):Android下SQL数据库开发

在Android开发 中,数据库是不可缺少的.在Android开发中,用的是一种小型的嵌入式数据库,sqllite.今天会写两篇关于Android开发环境下数据库开发的文章,第一篇先介绍使用android自带的API来实现数据库的使用和管理以及增删改查.数据库升级的相关操作. 一.数据库第一次生成 1.javabean文件的准备 这里以一个Person类为例子来描述 package com.example.freedomsql.bean; import java.io.Serializable;

王者荣耀是怎样炼成的(一)《王者荣耀》用什么开发,游戏入门,unity3D介绍

在国内,如果你没有听说过<王者荣耀>,那你一定是古董级的人物了. <王者荣耀>(以下简称“农药”),专注于移动端(Android.IOS)的MOBA游戏.笔者看到这么火爆,就萌生了了解一下这类游戏的开发历程,本专栏的目标是做一个类MOBA的Demo. 俗话说,不去瞎琢磨的程序员,不是好司机. 好的,直接进入正题. 一.农药用什么语言和软件开发 小伙伴看到农药运行在Android和IOS平台上,估计第一个想到的就是 java / kotlin 和 Object-C / swift 了

(转)&lt;Unity3D&gt;Unity3D在android下调试

转自:http://blog.csdn.net/zuoyamin/article/details/11827309 一.工具准备 1.JDK——由于android是基于Java平台开发的,jdk是必须要安装的.下载地址:http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe 2.Android SDK——这个就不多说了,要开发a

linux-mint下搭建android,angularjs,rails,html5开发环境

目录[-] 必备软件: 环境配置: [open-jdk-6.0] [android-sdk] [ant] [github] [node.js] [rvm](ruby-1.9.3 rails-4.0.0 gemfile) 必备概念: 关于自动化部署我推荐大家参谋一下Fortune Zhang的一篇文章:android开发过程中我是怎么一步步让项目自动化起来的 最新更新链接:https://gist.github.com/Channely/8296901 系统以64bit为例进行配置/2013/11

[Android]开发数独游戏思路分析过程

数独游戏风靡已久,下面就将开发一款数独游戏的Android应用过程进行分解和说明. 先上图,再逐次分析开发这款游戏的涉及到的技术点,游戏逻辑. 简述:数独游戏是通过在9*9(大九宫格)的格子中空白的格子填写1-9中的任意一个数字,使得每一个行和每一列都由1-9这10个数字填满,并且在每3*3(小九宫格)的格子中同样也是由1-9这10个数组填满.即表示游戏完成. 分析游戏逻辑: 游戏中的每个格子可能的数字有1-9 游戏开始显示的数字,通过一份完整的数独,将部分格子设为空白,得到游戏初始值 游戏中的