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

news/2024/7/24 9:08:01 标签: 游戏, 开发工具, java

首先,我们需要一台已经配置好可以开发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


http://www.niftyadmin.cn/n/1846045.html

相关文章

el-table懒加载树形数据,实现整行点击的展开

做项目遇到一个需求&#xff0c;根据集团层级展现一组数据&#xff0c;每个层级都可以点开看更详细的拆分数据&#xff0c;第一想法是用el-table的树形数据来展示&#xff0c;大概下面这个样子&#xff1a; 用过这个组件的应该知道这个只能通过点击每一行前面的小箭头实现伸缩&…

Java并发专题 带返回结果的批量任务执行 CompletionService ExecutorService.invokeAll(转)...

转载请标明出处&#xff1a;http://blog.csdn.net/lmj623565791/article/details/27250059 一般情况下&#xff0c;我们使用Runnable作为基本的任务表示形式&#xff0c;但是Runnable是一种有很大局限的抽象&#xff0c;run方法中只能记录日志&#xff0c;打印&#xff0c;或者…

OpenGL ES 绘制纹理

在OpenGL ES中绘制一张图片需要使用到纹理&#xff08;texture&#xff09;&#xff0c;绘制纹理步骤如下&#xff1a; 编写shader 绘制纹理的shader需要顶点数据、纹理顶点数据和纹理。Vertex Shader代码如下&#xff1a; attribute vec4 a_Position; attribute vec2 a_TexCoo…

[WebGL入门]十四,绘制多边形

注意&#xff1a;文章翻译http://wgld.org/。原作者杉本雅広(doxas)&#xff0c;文章中假设有我的额外说明&#xff0c;我会加上&#xff3b;lufy&#xff1a;&#xff3d;。另外&#xff0c;鄙人webgl研究还不够深入。一些专业词语&#xff0c;假设翻译有误&#xff0c;欢迎大…

[前端面试套餐css+js+vue+es6]第八天

前端面试套餐css&#xff1a;如何实现两栏布局&#xff0c;右侧自适应&#xff1f;三栏布局中间自适应呢&#xff1f;两栏布局BFCfloatflex弹性布局三栏布局两边使用float&#xff0c;中间使用margin两边使用absolute&#xff0c;中间使用margin两边使用float和负margindisplay…

C语言成长学习题(十七)

81.调用函数,完成单向动态链表的建立,输出各结点的值. 1 #include <stdio.h>2 #include <stdlib.h>3 4 typedef struct lst5 {6 int num;7 struct lst *next;8 }LST;9 10 LST *mycreat () 11 { 12 int m; 13 LST *head, *p, *q; 14 15 head …

异常(补充)

总结 异常是什么&#xff1f;是对问题的描述。将问题进行对象的封装。 异常体系&#xff1a; ​ ​Throwable ​ ​ ​ ​ |--Error ​ ​ ​ ​ |--Exception ​ ​ ​ ​ ​ ​ ​|--RuntimeException 异常体系的特点&#xff1a;异常…

redis集群部署(redis-cluster)

什么是redis集群&#xff1f;Redis 集群是一个分布式&#xff08;distributed&#xff09;、容错&#xff08;fault-tolerant&#xff09;的 Redis 实现&#xff0c; 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集&#xff08;subset&#xff09;。Redis 集群中…