一、背景
虽然使用Unity3D可以完成制作一款游戏的绝大部分工作,但是在研发过程中,对于一些功能,比如实现手机震动、获取手机剩余存储空间等,就需要建立Unity与Android的交互。
二、Unity与Android的交互方式
Unity与Android的交互有两种方式:1.Unity使用jar\aar库;2.Unity导出gradle项目,在AndroidStudio中进行二次开发。
本文以实现手机震动功能为例,采取第一种方式进行Unity与Android的交互。
三、运用Android Studio导出jar包
1.新建Android Studio工程:设置项目名称为PhoneShake,设置包名为com.unity.phoneshake。
2.新建Library:注意包名还是com.unity.phoneshake。
3.引入unity的 classes.jar包:将classes.jar复制到Android Studio项目mylibrary/libs下,选中classes.jar右键→Add As Library。(classes.jar包路径为Unity安装目录下:\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar)
4.添加手机震动权限申请:修改mylibrary下的AndroidManifest.xml。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity.phoneshake" >
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:label="手机振动">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
</manifest>
5.在mylibrary下创建MainActivity类,该类继承自UnityPlayerActivity。
package com.unity.phoneshake;
import android.app.Service;
import android.os.Bundle;
import android.os.Vibrator;
import android.widget.Toast;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void UnityCallShake(String msg){
Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_LONG).show();
Vibrator vibrator=(Vibrator)getApplication().getSystemService(Service.VIBRATOR_SERVICE);
vibrator.vibrate(2000);
}
}
6.导出jar包:选中mylibrary,"Build"→"Make Module 'mylibrary' ",将生成的aar包解压,将解压出来的classes.jar替换libs文件夹下的classes.jar(aar包路径:mylibrary\build\outputs\aar)。
四、Unity使用jar包
1.创建Unity新工程,将上一步解压出来的libs文件及AndroidManifest.xml文件导入到Unity工程Plugins/Android文件夹下。
2.创建一个Button,写入与Android交互的代码。设置包名与Android Studio工程中包名一致,打包项目即可生成apk。
using UnityEngine;
using UnityEngine.UI;
public class CallAndroid : MonoBehaviour {
AndroidJavaObject JavaObject;
private void Awake()
{
this.GetComponent<Button>().onClick.AddListener(delegate
{
ClickShakeBtn();
});
}
void Start()
{
AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
JavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity");
}
public void ClickShakeBtn()
{
JavaObject.Call("UnityCallShake", "来自Unity的调用");
}
}