坑爹的Unity与Android交互

来源:互联网 发布:js微信短网址生成api 编辑:程序博客网 时间:2024/05/24 02:58
本人在开发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 framevoid Update () {}//在GUI上画一个可以震动手机的button    void OnGUI(){        if (GUI.Button(new Rect(240, 250, 100, 40), "vibrate"))        {            phoneVibrate();        }    }    private int add(int a, 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”。所以必须要三码合一

 
 
0 0
原创粉丝点击