您的位置:首页 > 移动开发 > Unity3D

坑爹的Unity与Android交互

2016-03-08 00:08 429 查看
本人在开发Unity游戏过程中,需要增加一些功能,例如手机震动,打开公司网页,打开微信程序分享游戏。这些功能,unity并不能直接实现的,毕竟unity生成的游戏,而不是手机系统,当然不能够实现啦。因此,想要实现这些手机平台上的功能,还是需要跟原生平台打交道,通过调用原生平台提供的API来实现滴。

上网查看了很多的例子,这里集合了其他开发者的案例写下了这篇文章,做做笔记。

雨松大神的这一篇《Unity3D研究院之与Android相互传递消息(十九)》http://www.xuanyusong.com/archives/676

xv_ly15 的这篇《[Unity3D]调用Android接口》http://blog.csdn.net/xv_ly15/article/details/9314199/

这里我就以unity实现android手机平台震动为案例,分享一下我的经验吧!Let’s go!

这次我们需要的Eclipse版本为Luna Service Release 2 (4.4.2) Build id: 20150219-0600。

Android sdk版本为24.0.2

ADT版本为23.0.6.1720515

C#:vs2015

原理:

步骤:

1、 建立提供给Unity调用的方法。

首先,我们用Eclipse新建一个android项目。



设置好包名、应用的名字











2、将Unity的class.jar作为类库导入到android项目当中。具体的class包要根据unity的安装位置而定。





 


 

 

3、好了,我们将所有的东西都准备好了。我们就开始写安卓端震动的功能。方法都在MainActivity类中,作为静态调用。

MainActivity.java
package com.flashZero.game;

import android.os.Bundle;
import android.os.Vibrator;

import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity
{
private static Vibrator v;
private static boolean isInit;//初始化手机震动标识
private static long[] pattern = { 100L, 400L, 100L, 400L };

protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
v = (Vibrator)this.getSystemService("vibrator");//这里是应用程序一开始就获取该activity的系统服务,用于手机震动
isInit = true;
}

/**
* 手机震动方法
*/
public static void vibratePhone()
{
if (!isInit) {
return;
}
v.vibrate(pattern, 3);
}

/**
* @param time 震动时间
*/
public static void vibratePhone(int time)
{
if (!isInit) {
return;
}
v.vibrate(pattern, 2);
}

}


3、 编写完功能后,我们就将它导出为jar包。

右键package explorer中的src,将src文件导出为jar包。





 

 


 

4、 当然,我们还需要配置一下AndroidManifest.xml文件。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.flashZero.game"
android:versionCode="1"
android:versionName="1.0" >
<!-->震动权限<-->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.flashZero.game.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<!-->启动方式<-->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>


这里有一个activity,就是我们刚才写的jar包中的mainActivity,默认启动。

5、 好了,我们得到了一个震动的jar包后,然后将android项目的资源都复制到unity项目中的Plugins/Android中作为插件来使用。

结构如下:



 


 

将刚才热辣辣导出的jar包放到在libs文件夹中。

 


呼,android方面都基本上搞定了,然后我们就编写unity里的代码。

1、 新建一个C#文件,用于调用android的方法。把该代码挂在一个GameObject中。

代码如下:
using UnityEngine;
using System.Collections;
using System;
using UnityEngine.UI;
public class TestAndroid : MonoBehaviour {

// Use this for initialization
public Text t1;
private AndroidJavaClass ajc;
void Start () {
//获取jar包中的Untils中的引用
ajc = new AndroidJavaClass("com.flashZero.game. MainActivity ");
}

// Update is called once per frame
void Update () {

}
//在GUI上画一个可以震动手机的button
void OnGUI()
{

if (GUI.Button(new Rect(240, 250, 100, 40), "vibrate"))
{
phoneVibrate();
}
}
private int add(int a
9685
, int b)
{
return ajc.CallStatic<int>("add",a,b);
}
private void phoneVibrate()
{
ajc.CallStatic("vibratePhone");
}
}


这里重点的是AndroidJavaClass这个类,用于Unity调用java包中方法的类,一般我们可以使用CallStatic接口来调用java中的静态方法。这里调用的是MainActivity包中的vibratePhone静态方法来实现手机的震动。

2、 配置一下Unity导出设置

 


这里需要注意的是Bundle Indentifier,导出的jar包必须和这里的包名要一致。否者就需要修改android项目中的包名。

最后,我们就可以导出apk来测试一下手机震动的功能。

后记:

遇到的问题

1、 Unable to convert classes into dex format. See the Console for details.





 


这个问题的出现,最主要是android插件目录中有相同的包。开发过程中很多时候包重复,这个是很蛋疼的。所以只能是查看一下哪些包出现了重复,把重复的包给删除就能解决了。又或者是在开发android的时候,。最好是引用其他项目中jar包,而不是将其代码复制到其中,避免冲突。

这里介绍一个java的查看工具,java-gui,可以查看一些jar包中的class文件,这个方便我们去找出问题所在。下载地址:http://jd.benow.ca/

 

2、震动不能,Java中抛出异常。

 


这个错误我是一时大意了,是因为我java中定义的静态方法是在com.flashZero.game.Unitls类中,并不是MainActivity类中,而我在c#中调用的是在”com.flashZero.game.MainActivity”。所以必须要三码合一





 


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: