坑爹的Unity与Android交互

本人在开发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, 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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值