开发环境:

  • 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代码调用本地代码库。这使得Unity可以整合其他中间件库或者遗留的游戏代码。插件是Pro版独有特性。对于桌面系统的构建,插件仅仅能在独立版中运行。而构建网页版本时由于安全问题会被禁用。鉴于这里我们主要是研究unity访问android的应用程序,所以我将只提及java代码写出来的插件(编译后的class文件打成的jar包)。

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

E文差的同学可以看这里

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

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

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

Eclipse导入Unity3D提供的编译Android游戏所需要的jar包

这里unityclasses.jar就是unity 提供的编译Android游戏所需要的jar包,它所在的目录是:

%unity_home%\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar

我们新建的项目默认继承自Activity,这里将其修改为继承自UnityPlayerActivity,并去掉

setContentView(R.layout.main);

即:

1
2
3
4
5
6
7
8
public class SMSActivity extends UnityPlayerActivity {
 
    public void onCreate(Bundle savedInstanceState) {
 
      super.onCreate(savedInstanceState);
 
    }
}

在UnityPlayerActivity的onCreate()方法中已经做好了针对unity自己游戏的view布局,这里我们将onCreate继承过来不能将他们的布局给重写掉,否则我们的游戏画面就看不到在unity中做出的绚丽游戏场景了。 准备工作完成了,下面来添加我们的发信息逻辑的具体方法:

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

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

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

好了,我们在Eclipse中要做的工作就到这里了,接下来是把我们写好的Java代码编译成我们需要的插件jar文件。 打开cmd,进入到我们的项目bin\classes文件夹下执行下面命令:

jar cvf com.qyxls.sms.jar com\
Java编译用于Unity3D开发的插件

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

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

Unity3D调用安卓应用程序

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

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

Unity3D调用安卓应用程序

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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。

Unity3D调用安卓应用程序

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

Unity3D调用安卓应用程序

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

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

Unity3D调用安卓应用程序

然后将刚刚建立的GUISkin赋值给mySkin,这样我们的应用就能显示和输入中文了。

在unity中调用Java插件

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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函数添加在发送按钮的响应事件里就可以了:

1
2
3
4
5
6
7
if(GUI.Button(new Rect(240, 250, 100, 40), "发送"))
{
    if(txtNumber != "" && txtMessage != "")
    {
        SendMsg(txtNumber, txtMessage);
    }
}

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

Unity3d调用安卓应用程序

全段完整的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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来调用:

1
Application.OpenURL("sms:");

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

原文:guzhou.me

 

声明: 本文由(zqcyou)原创编译,转载请保留链接: Unity开发Android应用程序:调用安卓应用程序功能

Unity开发Android应用程序:调用安卓应用程序功能的更多相关文章

  1. unity开发android游戏(一)搭建Unity安卓开发环境

    unity开发android游戏(一)搭建Unity安卓开发环境 分类: Unity2014-03-23 16:14 5626人阅读 评论(2) 收藏 举报 unity开发androidunity安卓 ...

  2. unity开发android游戏

    环境搭建: Unity+JDK+Android Studio+Android SDK(+NDK) 教程:unity开发android游戏(一)搭建Unity安卓开发环境 注意“Build System ...

  3. Unity开发Android应用优化指南(上)

    http://forum.china.unity3d.com/thread-27037-1-2.html 如今越来越多的开发者使用Unity开发Android及iOS项目,开发过程中难免会遇到一些性能 ...

  4. Unity开发Android应用优化指南(下)

    http://forum.china.unity3d.com/thread-27044-1-1.html 在Unity开发Android应用优化指南(上)一文中,从游戏性能,脚本等方面进行了分析和总结 ...

  5. 【转】unity开发android游戏(一)搭建Unity安卓开发环境

    http://blog.csdn.net/chenggong2dm/article/details/20654075 1,下载安装Java的JDK: http://www.oracle.com/tec ...

  6. 使用Unity开发Android的几种调试方法

    前言 本文举例几种Android 调试的方法(PS:我是通过unity引擎来开发安卓游戏) Eclipse + adt 查看LOG 1.为Eclipse 装上adt 插件 2.打开Eclipse 的L ...

  7. 在Delphi开发的服务中调用指定应用程序

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://fxh7622.blog.51cto.com/63841/529033 在很多时候 ...

  8. Android于JNI调用列出的程序

    1.安装和下载cygwin,下载Android NDK: 2.于ndk工程JNI接口设计: 3.采用C/C++实现本地方法. 4.JNI生成动态链接库.so档: 5.动态链接库副本javaprojec ...

  9. JAVA-JNI java程序调用c/c++程序

    目的:写c/c++函数,让java调用 java代码 1.创建HelloJNI.java文件->编写代码如下->cmd中javac HelloJNI.java获取HelloJNI.clas ...

随机推荐

  1. Spring多数据源的配置和使用

    1. 配置多个数据源 最近开发一个数据同步的小功能,需要从A主机的Oracle数据库中把数据同步到B主机的Oracle库中.当然能够用dmp脚本或者SQL脚本是最好,但是对于两边异构的表结构来说,直接 ...

  2. CSS3学习笔记之属性值

    font-family 设置文本的字体名称. font-style 设置文本样式. 取值 normal不使用斜体. italic使用斜体. oblique使用倾斜体. inherit从父元素继承. f ...

  3. 快速了解AngularJs HTTP响应拦截器

    任何时候,如果我们想要为请求添加全局功能,例如身份认证.错误处理等,在请求发送给服务器之前或服务器返回时对其进行拦截,是比较好的实现手段. angularJs通过拦截器提供了一个从全局层面进行处理的途 ...

  4. [转]Android WebView播放视频(包括全屏播放),androidwebview

    Android WebView播放视频(包括全屏播放),androidwebview 最近项目开发中用到了WebView播放视频的功能,总结了开发中犯过的错误,这些错误在开发是及容易遇到的,所以我这里 ...

  5. 在Windows下安装64位压缩包版mysql 5.7.11版本的方法

    为了学习数据库,自己去网上下载了最新版本的Windows64位的mysql 5.7.11,但是花了很长的时间在安装的问题上,同时也借鉴了几位前辈的博文来帮助自己解决在安装过程中遇到的问题,安装成功之后 ...

  6. css3 translate属性

    translate(x,y)水平方向和垂直方向同时移动(也就是X轴和Y轴同时移动):translateX(x)仅水平方向移动(X轴移动):translateY(Y)仅垂直方向移动(Y轴移动)默认都是从 ...

  7. 张艾迪(创始人):DCM的不识人.我说我会像乔布斯一样成为投资者的骄傲

      Eidyzhang解码:天才Eidyzhang的诞生 张艾迪(创始人):第一个实习生精英团队 张艾迪(创始人):DCM的不识人.我说我会像乔布斯一样成为投资者的骄傲 2014-05-31 09:4 ...

  8. C#中DateTime应用

    编写一个控制台程序,输入一个日期,求下一天的日期. 要求如下:在控制台输入一个日期(分别输入年.月.日),判断输入的日期是否有效,如果有效,计算该日期的下一天日期,并显示:否则,输出"无效的 ...

  9. 最小生成树练习2(Kruskal)

    两个BUG鸣翠柳,一行代码上西天... hdu4786 Fibonacci Tree(生成树)问能否用白边和黑边构成一棵生成树,并且白边数量是斐波那契数. 题解:分别优先加入白边和黑边,求出生成树能包 ...

  10. 在Linux下安装aws命令行操作

    使用安装包安装 环境: Linux, OS X, or Unix Python 2 version 2.6.5+ or Python 3 version 3.3+ 检查Python版本 $ pytho ...