Unity中访问Android手机应用程序

原创 2012年03月21日 10:47:44

开发环境:

Eclipse3.4      adt12      jdk6        Androidsdk2.2

Unity3.4         windows7

测试设备:

HTC Desire HD

 

本文要涉及到的几个重点问题

1、 unity里怎么使用java插件

2、 unity android中怎么接受汉字

3、 unity调用Android应用程序的步骤

 

说明一点:这里我们要调用的手机应用程序是发信息的apk程序。

 

unity里怎么使用java插件

unity里面能使用插件这是unity人都知道的,相信大家都了解过iTween、iGUI、EZGUI等插件,但我们这里要说的是我们自定义的来供我们开发使用的插件。Unity支持基于C,C++或Objctive-C语言的插件。插件允许你的代码调用本地代码库。这使得Unity可以整合其他中间件库或者遗留的游戏代码。插件是Pro版独有特性。对于桌面系统的构建,插件仅仅能在独立版中运行。而构建网页版本时由于安全问题会被禁用。鉴于这里我们主要是研究unity访问android的应用程序,所以我将只提及java代码写出来的插件(编译后的class文件打成的jar包)。

具体关于插件的内容请参看官方手册:

http://unity3d.com/support/documentation/Manual/Plugins.html

E文差的同学可以看这里:

http://game.ceeger.com/Manual/Plugins.html


基础内容就说这么多,下面开始我们的具体内容:

首先在Eclipse中新建一个Android工程,这个没有什么说的。创建完项目之后要做的有两点:

1、将Unity中关于编译Android程序的jar包导入到我们的项目中,具体右击项目选择Properties:

这里unityclasses.jar就是unity 提供的编译Android游戏所需要的jar包,它位于%unity_home%\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar

2、我们新建的项目默认继承自Activity,这里将其修改为继承自UnityPlayerActivity,并去掉setContentView(R.layout.main);

public class SMSActivity extends UnityPlayerActivity {
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
    }
}

在UnityPlayerActivity的onCreate()方法中已经做好了针对unity自己游戏的view布局,这里我们将onCreate继承过来不能将他们的布局给重写掉,否则我们的游戏画面就看不到在unity中做出的绚丽游戏场景了。

准备工作完成了,下面来添加我们的发信息逻辑的具体方法:

//我这里所需要的参数是对方的手机号码和要发送的短信息的内容,
//在unity中调用该方法时传入这两个参数
public static void SMSSend(String number, String content){
    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(number, null, content, null, null);
}

这里需要注意的一点就是调用发信息的功能需要在Androidmanifest.xml中声明权限:

<uses-permission android:name="android.permission.SEND_SMS"/>

好了,我们在Eclipse中要做的工作就到这里了,接下来是把我们写好的Java代码编译成我们需要的插件jar文件。

打开cmd,进入到我们的项目bin\classes文件夹下执行:

jar cvf com.qyxls.sms.jar com\命令

这时候在bin\classes文件夹下会发现一个com.qyxls.sms.jar。这就是我们需要的插件了。(我也有试着从Eclipse中导出jar文件,但不知道为什么最后插件不能使用)

 

接下来是创建我们的Unity工程了,同样的,步骤不说。创建完成之后在Project视图中新建一个Plugins文件夹(注意名字不要错,起初我漏掉了一个s都调试了好半天的),再在新创建好的Plugins文件夹下创建一个Android文件夹,然后在Android文件夹下新建一个bin文件夹用来存放我们上一步骤中做出来的jar插件。最后不要忘了把Android项目中的配置文件Androidmanifest.xml文件要考到该目录下,这里面有我们添加的权限信息,不然运行unity程序发信息会报安全错误的。由于该文件中还用到一些资源,所以一并把res文件夹也全部拷贝到Android文件夹下,这样之后的目录结构如下示:

这个样子和Android的项目结构又差不多了吧。

 

接下来我们的工作重心转移到unity的代码编写上来。首先就是做出我们的一个测试界面,这个不多说,看效果图直接上代码(这个是很简单很简单的了)。

代码:

using UnityEngine;
using System.Collections;

public class Scripts : MonoBehaviour {
	public GUISkin mySkin;
	
	private string txtNumber = "";
	private string txtMessage = "";

	void OnGUI()
	{
		GUI.skin = mySkin;

		GUI.Label(new Rect(40, 40, 100, 50), "电话号码");
		txtNumber = GUI.TextField (new Rect (140, 40, 160, 30), txtNumber);

		GUI.Label(new Rect(40, 80, 100, 50), "短信内容");
		txtMessage = GUI.TextArea (new Rect (140, 80, 200, 160), txtMessage);

		if(GUI.Button(new Rect(240, 250, 100, 40), "发送"))
		{

		}
	}

}

按照上面的步骤做完的同学会发现:我运行到手机上的应用怎么没有Label和Button上的汉字提示呢?这里就是我们要提到的另一个重点:在Android手机上显示汉字的问题。

首先要使用中文就得有个中文字体了,我这个是用的Android手机上系统的默认字体DroidSansFallback.ttf。找不到字体的同学也可以去我们计算机C盘下去找一个中文字体来用,但要注意找的字体一定要是ttf格式的,这个是unity支持的。

找到字体后的导入方式是和其它资源导入一样的,可以新建一个Resources文件夹来放我们的中文字体,导入之后选中字体,在属性面板中要设置为unicode。

点击Apply后要等待好长一段时间等待unity生成这样的一张巨大的字体贴图:

从贴图尺寸和大小也可以看出,中文字体是很费资源的,这里也建议大家万不得已要用到中文字的话,尽量把需要的字做成图片来用,以达到节省我们宝贵的手机资源的目的。

这样之后我们要告诉unity我们所使用的中文字体:新建一个GUISkin,并将字体设置为我们刚刚导入并设置好的中文字体即可。

这样我们的应用就能显示和输入中文了。

现在终于到了我们的核心:在unity中调用Java插件来实现我们需求的功能了。先来看一下核心代码:

private AndroidJavaClass ajc;
void Start () 
{
	//通过unity提供的访问java插件的帮助类来找到我们的插件并创建对象
	ajc = new AndroidJavaClass("com.qyxls.sms.SMSActivity");
}
void SendMsg(string number, string msg)
{
	//调用插件中的SMSSend方法发送信息
	ajc.CallStatic("SMSSend", new string[]{number, msg});
}

CallStatic这个函数需要两个参数,第一个是要调用的插件里的函数名,第二个是要调用的函数所需要的参数,要以数组的形式传入,参数可以是任意类型的。

其他的关于这个类的使用可以参照文档。

 

我们把SendMsg函数添加在发送按钮的响应事件里就可以了:

if(GUI.Button(new Rect(240, 250, 100, 40), "发送"))
{
	if(txtNumber != "" && txtMessage != "")
	{
		SendMsg(txtNumber, txtMessage);
	}
}

我们来看看效果,这里避免骚扰别人,并且再给我们的测试来一个反馈,我就麻烦一下一直为我们服务的中国移动了。


全段完整的代码如下:

using UnityEngine;
using System.Collections;

public class Scripts : MonoBehaviour {
	public GUISkin mySkin;
	
	private string txtNumber = "";
	private string txtMessage = "";

	private AndroidJavaClass ajc;

	void Start () 
	{
		ajc = new AndroidJavaClass("com.qyxls.sms.SMSActivity");
	}	

	void OnGUI()
	{
		GUI.skin = mySkin;

		GUI.Label(new Rect(40, 40, 100, 50), "电话号码");
		txtNumber = GUI.TextField (new Rect (140, 40, 160, 30), txtNumber);

		GUI.Label(new Rect(40, 80, 100, 50), "短信内容");
		txtMessage = GUI.TextArea (new Rect (140, 80, 200, 160), txtMessage);

		if(GUI.Button(new Rect(240, 250, 100, 40), "发送"))
		{
			if(txtNumber != "" && txtMessage != "")
			{
				SendMsg(txtNumber, txtMessage);
			}
		}
	}	
	
	void SendMsg(string number, string msg)
	{
		ajc.CallStatic("SMSSend", new string[]{number, msg});
	}

}

到这里我们的工作就全部做完了,整个过程就是上面说明的这些了。

其实,要调用发信息的apk,还有一个更简单的方法的,就是利用Application类的OpenURL来调用:

Application.OpenURL("sms:");

这样会调出发短息的应用界面,而且里面还可以带参数的,但我们这里的重点是说如何使用Java插件的问题,那个方法就不做讨论了。


附上资源下载地址:

http://download.csdn.net/detail/qyxls/4158270



原创文章,转载请注明出处:http://blog.csdn.net/qyxls/article/details/7376891



UNITY3D android 启动其他程序,启动apk C#代码

void openPackage(string pkgName)     {         using (AndroidJavaClass jcPlayer = new AndroidJavaC...

linux下网络探测工具nmap的使用小结

1.nmap       扫描器是一种能够自动检测主机安全性弱点的程序。扫描器通过发送特定的网络数据包,记录目标主机的应答消息,从而收集关于目标主机的各种信息。目前网络上有很多扫描软件,比较著名的扫描...

Unity+ Photon服务器实时对战游戏——Photon服务器介绍(一)

最近打算做实时对战的类似lol的游戏,也在学习使用Photon服务器,就分享一下。这可能是一个系列文章。记录一下学习过程,分享一下经验收获。 今天先介绍一下Photon服务器是什么,可以做什么,为什么...

用PHP构建Android手机应用程序.pdf

  • 2011年12月22日 09:20
  • 64KB
  • 下载

Android手机应用程序转移到SD卡操作

前面已经对Android低版本手机中,对SD卡分区的介绍

Android:获取手机应用程序信息工具类

可以获得手机中,系统应用,第三方应用。根据包名获得应用信息,判断应用是否是系统应用 package com.zhuoma.packagemanager.utils; import java.util...

Android在网页下(WebView中运用HTML)点击按钮打开本地手机应用程序

Android在网页下(WebView中运用HTML)点击按钮打开本地手机应用程序 最近在做一个Android项目 其中有个需求是在网页中打开本地应用 本来如果是自己项目的使用WebView的话...

【android开发】手机应用管理器的实现之实现对应用程序的运行、分享、卸载功能(三)

上一篇我们利用popupwindow类实现对话框,对话框主要功能包括运行、分享、加锁、卸载。今天我们就对其中的运行、分享、卸载功能进行实现,由于软件锁实现起来相对复杂一些,这个功能我们会放在下一次博客...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity中访问Android手机应用程序
举报原因:
原因补充:

(最多只允许输入30个字)