接上文,之前我们采用了直接将Unity项目导出为Eclipse项目来修改的方式,这种做法存在的一个最大的问题就是:每当Unity被修改之后,都需要重新导出,而每次导出的项目在Android平台方面的Java代码又需要重新编写对应的功能,这样开发效率会受到极大的影响,所以这里我们使用另外一种方式来移植,使Unity和Android方面的修改可以互不影响。

Unity3D项目

我们新建一个Unity3D的项目,并为其添加两个按钮和一个文本框,同时将下面的脚本挂载到摄像机中即可:

 using UnityEngine;
using UnityEngine.UI; public class SceneScript : MonoBehaviour
{
public Text outpuText; //与 Android 交互的对象
private AndroidJavaObject _activity; void Start()
{
//获取与 Android 交互的对象
AndroidJavaClass javaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
_activity = javaClass.GetStatic<AndroidJavaObject>("currentActivity");
} public void ShowDialog()
{
_activity.Call("showDialog", new string[]{"提示", "我是被Unity调用的对话框!"});
} public void CallAndroid()
{
_activity.Call("unityCall");
} /// <summary>
/// 该方法由 Android 调用.
/// </summary>
/// <param name="msg">传递过来的参数.</param>
private void AndroidCallback(string msg)
{
outpuText.text += "\n" + msg;
}
}

记住Bundle Identifier一定要设定,同时要记住该设定值,我们在创建Android应用时填写的Package Name必须填写同该值一样的值。

Android项目

我们先创建一个Android项目:

需要注意的是,Package Name必须和Unity3D中的Bundle Identifier一致。

勾选红框内的内容,表示作为库工程。

接下来的几步默认即可。

报错处理

我这里使用的是Android5.0的SDK,莫名其妙的新建项目会报错,搞得头大,最后找到的解决方法是第一步创建项目时,选择Mininum Required SDK为API16及以上的版本即可,如果有遇到同样问题的同学可以试试这个办法。

我们创建好Android库项目后,它和Unity之间是无法调用的,我们还需要引入Unity为Android平台提供的库文件,路径如下:你的unity安装目录\Editor\Data\PlaybackEngines\androidplayer\release\bin\classes.jar

打开MainActivity修改为下面的代码:

 package com.Hammerc.AndroidTest;

 import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity; import android.app.AlertDialog;
import android.os.Bundle; //修改继承关系, 改为继承自 UnityPlayerActivity
public class MainActivity extends UnityPlayerActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
} private void showDialog(final String title, final String content)
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
makeDialog(title, content);
}
});
} private void makeDialog(String title, String content)
{
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle(title);
builder.setMessage(content);
builder.setCancelable(false);
builder.setPositiveButton("确定", null); builder.show();
} private void unityCall()
{
UnityPlayer.UnitySendMessage("Main Camera", "AndroidCallback", "我是Android平台发送的消息!");
}
}

在菜单中选择“Project”->“Clean”,即可在bin文件夹下找到我们的androidtest.jar文件了。

导入jar到Unity中

新建Plugins\Android文件夹,并将androidtest.jar文件拷贝到该文件夹中,注意文件夹名称必须为该名称。

接下来我们需要去你的unity安装目录\Editor\Data\PlaybackEngines\androidplayer目录下复制AndroidManifest.xml文件到Plugins\Android文件夹中。

打开AndroidManifest.xml文件,修改:

 <activity android:name="com.unity3d.player.UnityPlayerNativeActivity"

 <activity android:name="com.Hammerc.AndroidTest.MainActivity"

接下来直接发布为apk文件即可。

源文件下载

http://pan.baidu.com/s/1yTLCU

Unity3D之移植学习笔记:移植到Android平台更好的方法的更多相关文章

  1. C#可扩展编程之MEF学习笔记(三):导出类的方法和属性

    前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...

  2. Android平台Airplay的实现方法

    Airplay属于局域网内异构设备之间分享多媒体数据的一种通信协议.Airplay设备有客户端和服务器之分,一般将小屏IOS设备实现为Airplay客户端,大屏幕设备实现为Airplay服务器.即iP ...

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

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

  4. Android(java)学习笔记267:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  5. Unity3D之UGUI学习笔记(一):UGUI介绍以及Canvas

    UGUI是Unity3D4.6官方提供的UI系统,支持2D和3D UI的开发. Unity3D UI史 OnGUI 在Unity4.6之前,官方提供的是OnGUI函数来开发UI界面,当然问题也比较多, ...

  6. Android(java)学习笔记211:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  7. Unity3D之UGUI学习笔记(三):EventSystem

    在UGUI中,EventSystem实现了所有关于交互方面的功能,和NGUI不一样的地方是,我们终于可以摆脱添加Box Collider了! 下面我们来学习一下. 对于按钮来说,直接有onClick的 ...

  8. Android(java)学习笔记124:Android权限大全

    访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permissio ...

  9. Android学习笔记_51_转android 加载大图片防止内存溢出

    首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView, ...

随机推荐

  1. Alpha、Beta、RC、GA版本的区别

    Alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用. Beta:也是测试版,这个阶段的版本会一直加入新的功能.在Alpha版之后推出. RC:(Release Candi ...

  2. LA 3485 (积分 辛普森自适应法) Bridge

    桥的间隔数为n = ceil(B/D),每段绳子的长度为L / n,相邻两塔之间的距离为 B / n 主要问题还是在于已知抛物线的开口宽度w 和 抛物线的高度h 求抛物线的长度 弧长积分公式为: 设抛 ...

  3. dagli最早干了这样一件事儿 Localization of Cardiac-Induced Signal Change in fMRI

    Localization of Cardiac-Induced Signal Change in fMRI 这篇文章是最早做生理噪声相关组织的定位的. 很奇特,因为,这位学者甚至得出了,血管心动等变化 ...

  4. 利用ffmpeg解码h264流的代码

    这里也直接给出代码: h264dec.h: #pragma once #include "tdll.h" #include "avcodec.h" #inclu ...

  5. linux面试题1

    一.填空题:1. 在Linux系统中,以 文件 方式访问设备 .2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统.3. Linux文件系统中每个文件用 i节点 来标识. ...

  6. (1)quartz集群调度机制调研及源码分析---转载

    quartz2.2.1集群调度机制调研及源码分析 原文地址:http://demo.netfoucs.com/gklifg/article/details/27090179 引言quartz集群架构调 ...

  7. 【DFS】NYOJ-82 迷宫寻宝(一)-条件迷宫问题

    [题目链接:NYOJ-82] #include<iostream> #include<cstring> using namespace std; struct node{ in ...

  8. IOS 正则表达式匹配文本中URL位置并获取URL所在位置(解决连接中文问题)

    需求很简单,是从一段文本中匹配出其中的超链接.基本的做法就是用正则表达式去匹配.但是有这样一个问题. 网上大部分的识别URL的正则表达式url末尾有空格的情况下可以正确识别.比如这样的情况. 我是一段 ...

  9. Oracle表操作 (未完待续)

    1. Oracle 中将一个表中数据导入到另外一个表的方法 insert into scd_data_201007 select * from analog_data_201007 ; 2. 纵表转换 ...

  10. Android WebView常见问题的解决方案总结----例如Web page not available

    之前android虚拟机一直都可以直接联网,今天写了一个WebView之后,突然报出了Web page not available的错误,但是查看虚拟机自带的浏览器,是可以上网的,所以检查还是代码的问 ...