Unity3D之移植学习笔记:移植到Android平台更好的方法
接上文,之前我们采用了直接将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文件即可。
源文件下载
Unity3D之移植学习笔记:移植到Android平台更好的方法的更多相关文章
- C#可扩展编程之MEF学习笔记(三):导出类的方法和属性
前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...
- Android平台Airplay的实现方法
Airplay属于局域网内异构设备之间分享多媒体数据的一种通信协议.Airplay设备有客户端和服务器之分,一般将小屏IOS设备实现为Airplay客户端,大屏幕设备实现为Airplay服务器.即iP ...
- Unity3D之移植学习笔记:移植到Android平台
首先,我们需要一台已经配置好可以开发Android应用的计算机,这里我使用的是Windows系统+Eclipse+ADT的开发环境,当然也可以使用Android Studio或者使用Mac系统都可以. ...
- Android(java)学习笔记267:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Unity3D之UGUI学习笔记(一):UGUI介绍以及Canvas
UGUI是Unity3D4.6官方提供的UI系统,支持2D和3D UI的开发. Unity3D UI史 OnGUI 在Unity4.6之前,官方提供的是OnGUI函数来开发UI界面,当然问题也比较多, ...
- Android(java)学习笔记211:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Unity3D之UGUI学习笔记(三):EventSystem
在UGUI中,EventSystem实现了所有关于交互方面的功能,和NGUI不一样的地方是,我们终于可以摆脱添加Box Collider了! 下面我们来学习一下. 对于按钮来说,直接有onClick的 ...
- Android(java)学习笔记124:Android权限大全
访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permissio ...
- Android学习笔记_51_转android 加载大图片防止内存溢出
首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView, ...
随机推荐
- poj1088
这题是dp还是dfs+记忆化?(其实好像没什么区别?) 用f[i,j]表示滑到(i,j)时之后最多能滑多远,依次穷举每一个起点(i,j)则 f[i,j]=max{f[i,j-1],f[i-1,j],f ...
- HDU 1710 Binary Tree Traversals
题意:给出一颗二叉树的前序遍历和中序遍历,输出其后续遍历 首先知道中序遍历是左子树根右子树递归遍历的,所以只要找到根节点,就能够拆分出左右子树 前序遍历是按照根左子树右子树递归遍历的,那么可以找出这颗 ...
- poj 1364 King(差分约束)
题意(真坑):傻国王只会求和,以及比较大小.阴谋家们想推翻他,于是想坑他,上交了一串长度为n的序列a[1],a[2]...a[n],国王作出m条形如(a[si]+a[si+1]+...+a[si+ni ...
- acdream 1684 娜娜梦游仙境系列——莫名其妙的插曲 (gcd)
题意:一开始有一个集合,集合里有n个不同的数,然后Alice(娜娜)与Bob轮流进行操作,每人都可以任意选择两个数a,b,不妨设a>b,不过要求a-b不在集合中,把a-b放入集合(集合元素个数只 ...
- LeetCode: Reverse Words in a String && Rotate Array
Title: Given an input string, reverse the string word by word. For example,Given s = "the sky i ...
- Hide Xcode8 strange log.
Product > Scheme > Edit Scheme Environment Variables set OS_ACTIVITY_MODE = disable
- Mysql 的存储过程和存储函数
优点: v 提高安全性 v 简化mysql查询 v 减轻带宽负担 缺点: v 增加服务器负担 v 对我们开发者来说,难度大一点 PHP中的函数 Function funname(参数){ //函数体 ...
- POJ 1094 Sorting It All Out
题意:给出m对关于n个字母的小于关系,输出通过这些关系能得到的结论,如果可以排序就输出至少知道第几个关系时就可以知道顺序,从小到大输出顺序:如果产生歧义就输出在第几个关系时出现歧义,如果不能得出准确的 ...
- golang学习之指针、内存分配
func pointer_test() { //空指针,输出为nil var p *int fmt.Printf("p: %v\n", p) //指向局部变量,变量值初始为0 va ...
- bjfu1211 推公式,筛素数
题目是求fun(n)的值 fun(n)= Gcd(3)+Gcd(4)+…+Gcd(i)+…+Gcd(n).Gcd(n)=gcd(C[n][1],C[n][2],……,C[n][n-1])C[n][k] ...