• Unity3D之移植学习笔记:移植到Android平台


    首先,我们需要一台已经配置好可以开发Android应用的计算机,这里我使用的是Windows系统+Eclipse+ADT的开发环境,当然也可以使用Android Studio或者使用Mac系统都可以。

    导出到Eclipse

    设置U3D工程

    首先需要设置游戏的平台为Android:

    在Player Settings...面板中记得设定一下:

    这个名称需要设定。

    导出Android工程

    设定好Android的配置之后,我们需要对Android工程进行导出,我们仍然点击Builder Setting,勾选导出工程:

    我们将工程导出到指定的文件夹中,注意我们在导出过程中需要选择Android SDK和JDK的路径。

    导入工程

    我们打开Eclipse导入当前的工程:

    需要注意的是,如果我们当前的Workspace和导出的文件夹一致则会报错“Invalid project description”,解决的办法是,我们导出的文件夹和Workspace的文件夹不一致即可,如下:

    如上,我的导出路径是AndroidOutput文件夹,而我的Eclipse的Workspace是Android文件夹。

    Unity与平台交互

    在Android这边,我们要修改的是UnityPlayerNativeActivity.java文件:

    Android调用Unity的方法

    可以直接使用静态方法:

    UnityPlayer.UnitySendMessage(String arg0, String arg1, String arg2);

    我们看看他的3个参数:

    1. 第一个参数:位于场景中的GameObject的名称。
    2. 第二个参数:调用该GameObject身上存在的方法名称。
    3. 第三个参数:传递的参数,这里只能使用字符串类型。

    比如:我们场景中存在一个名为“AndroidInterface”的GameObject,同时为其绑定了一个脚本,脚本中存在一个名为“AndroidCallback”的方法,那么我们在Android平台上要调用该方法就可以使用下面的代码:

    UnityPlayer.UnitySendMessage("AndroidInterface", "AndroidCallback", "");

    有意思的是,Unity中的方法的访问权限不一定要是public的,使用protected及private都可以被调用到。

    Unity调用Android的方法

    Unity调用Android的方法首先要获取到AndroidJavaObject对象,同时调用的方法必须在UnityPlayerNativeActivity类中定义,我们看看下面的脚本:

     1 using System;
     2 using UnityEngine;
     3 
     4 /// <summary>
     5 /// 和 Android 平台交互相关的脚本.
     6 /// </summary>
     7 public class AndroidInterface : MonoBehaviour
     8 {
     9     private static AndroidInterface _instance;
    10 
    11     public static AndroidInterface GetInstance()
    12     {
    13         if(_instance == null)
    14         {
    15             throw new Exception("AndroidInterface is not initialized!");
    16         }
    17         return _instance;
    18     }
    19 
    20     private AndroidJavaObject _activity;
    21 
    22     void Awake()
    23     {
    24         if(_instance != null)
    25         {
    26             throw new Exception("GameDebug is Singleton!");
    27         }
    28         _instance = this;
    29 
    30         AndroidJavaClass javaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    31         _activity = javaClass.GetStatic<AndroidJavaObject>("CurrentActivity");
    32     }
    33 
    34     /// <summary>
    35     /// 弹出询问是否退出的对话框.
    36     /// </summary>
    37     public void ShowQuitDialog()
    38     {
    39         _activity.Call("showQuitDialog");
    40     }
    41 
    42     /// <summary>
    43     /// 弹出对话框.
    44     /// </summary>
    45     /// <param name="title">标题.</param>
    46     /// <param name="content">内容.</param>
    47     public void ShowDialog(string title, string content)
    48     {
    49         _activity.Call("showDialog", new string[]{title, content});
    50     }
    51 }

    我们通过如下调用即可调用到UnityPlayerNativeActivity类中对应名称的方法了:

    AndroidInterface.GetInstance().ShowQuitDialog();

    同时,Java方面的方法也可以是protected和private的访问权限,同时传递的参数无限制。

    调试程序

    (注:我这边使用模拟器运行时会报EGL_emulation的错误,调试实际上是不成功的,但是发布后是可以正常运行的。)

    选择“Run”-》“Run”即可。

    发布安装包

    由于已经作为Android工程所以不能再使用Unity3D来发布了,但是发布比较简单

    选择工程点击右键,“Android Tools”-》“Export Signal Application Package”即可,需要我们使用一个Keystore,没有进行创建即可。

    问题总结

    导入Android项目失败:http://www.crifan.com/adt_android_invalid_project_description_overlaps_the_location_of_another_project/

    Android模拟器启动报错:http://blog.csdn.net/yu413854285/article/details/7559333

    Installation error: INSTALL_FAILED_CONTAINER_ERROR:http://www.cnblogs.com/lovecode/articles/3658211.html

  • 相关阅读:
    linux 批量替换内容
    在Linux下如何查CC攻击?
    mysql init_connect
    利用javascript对字符串加密
    js学习笔记10----字符串的基本操作
    js学习笔记9----时间操作
    3种方法实现列表自动滚动
    如何解决wow.js与fullpage的兼容性
    js兼容获取元素的样式
    用php去除bom头
  • 原文地址:https://www.cnblogs.com/hammerc/p/4851056.html
Copyright © 2020-2023  润新知