unity和Android之间互相调用

      作为一名unity开发工程师,应该会经常遇到需要调用安卓设备的某些信息,这就需要了解unity和Android之间怎么通信的,废话不多说,直接说怎么用的。

      1.首先创建一个最简单的unity项目,里面创建一个最简单的空物体,起名就叫Driver吧,注意,这个名字是很关键的,后面Android调用unity的时候需要用到。给Driver创建一个脚本就叫AndroidUnityTool.cs。

 

public class AndroidUnityTool : MonoBehaviour
{
    private AndroidJavaClass JC;
    private AndroidJavaObject activityContext = null;
    private AndroidJavaObject androidRemoteUnity = null;
    public static readonly string ANDROID_JAVA_CLASS_EXPORT_TOOL_KIT = "com.hty.util.unityandroidbridge.UnityAndroidToolKit";

    private void Awake()
    {
        if (Application.platform == RuntimePlatform.Android)
        {
            if (JC == null)
            {
                CreateAndroidRemoteUnity();
            }
        }
    }

    void Start()
    {
        Debug.Log("AndroidUnityTool start.....");
        StartCoroutine(GetVersion());
    }

    private IEnumerator GetVersion()
    {
        yield return new WaitForSeconds(3);
        string versionName = androidRemoteUnity.Call<string>("getVersionName");
        string versionCode = androidRemoteUnity.Call<string>("getVersionCode");
        Debug.Log("AndroidUnityTool versionName:" + versionName + " versionCode:" + versionCode);

        androidRemoteUnity.Call("androidSendMsg", new string[] { "unity call android" });
    }

    private bool CreateAndroidRemoteUnity()
    {
        bool result = false;
        try
        {
            JC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            if (JC != null)
            {
                activityContext = JC.GetStatic<AndroidJavaObject>("currentActivity");
                if (activityContext != null)
                {
                    AndroidJavaClass exportToolKit = new AndroidJavaClass(ANDROID_JAVA_CLASS_EXPORT_TOOL_KIT);
                    if (exportToolKit != null)
                    {
                        androidRemoteUnity = exportToolKit.CallStatic<AndroidJavaObject>("instance");
                        androidRemoteUnity.Call("create", activityContext);
                        result = true;
                    }
                }

            }
        }
        catch (Exception e)
        {
            result = false;
        }

        return result;
    }

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

    }

    //-----------------------Android call unity--------------------------------

    public void AndroidSendMsg(string msg)
    {
        Debug.Log("AndroidUnityTool: " + msg);
    }
}

      注意这个值,ANDROID_JAVA_CLASS_EXPORT_TOOL_KIT = "com.hty.util.unityandroidbridge.UnityAndroidToolKit";

com.hty.util.unityandroidbridge是安卓工程的包名,可随意起,但是要对应上,UnityAndroidToolKit是安卓工程中类名,也可随意起。目前我的案例代码里面有三个方法,分别是获取版本号和版本名称,还有一个调用安卓的方法,然后安卓再回调unity的方法。unity这边还有一些准备工作就是在Assets目录下建立一个文件夹Plugins,Plugins下建立Android文件夹,Android下面建立libs文件夹。这样unity的准备工作差不多就完成了。

2.用Android studio创建一个安卓工程,注意刚开始的包名要对应上,即com.hty.util.unityandroidbridge,这时我们创建的是一个普通的安卓工程,需要做一些改动,让它成为一个可以生成aar包的lib工程,删除MainActivity.class,创建UnityAndroidToolKit.java类,代码如下

package com.hty.util.unityandroidbridge;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.util.Log;

import com.unity3d.player.UnityPlayer;

public class UnityAndroidToolKit {

    private static String TAG = "UnityAndroidToolKit";
    private static UnityAndroidToolKit instance;
    private Context context = null;

    public UnityAndroidToolKit() {
        instance = this;
    }

    public static UnityAndroidToolKit instance() {
        Log.d(TAG, "instance....");
        if (instance == null) {
            instance = new UnityAndroidToolKit();
        }
        return instance;
    }

    public void create(Context context) {
        Log.d(TAG, "create....");
        if (this.context == null) {
            this.context = context.getApplicationContext();
        }
    }

    public String getVersionCode() {
        Log.d(TAG, "getVersionCode....");
        PackageManager packageManager = context.getPackageManager();
        PackageInfo packageInfo;
        String versionCode = "";
        try {
            packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
            versionCode = packageInfo.versionCode + "";
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return versionCode;
    }

    public String getVersionName() {
        Log.d(TAG, "getVersionName....");
        PackageManager packageManager = context.getPackageManager();
        PackageInfo packageInfo;
        String versionName = "";
        try {
            packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
            versionName = packageInfo.versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return versionName;
    }

    public void androidSendMsg(String msg) {
        Log.d(TAG, "androidSendMsg....");
        UnityPlayer.UnitySendMessage("Driver", "AndroidSendMsg", msg + "from android");
    }
}

 改动如下

 AndroidManifest.xml改动如下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.hty.util.unityandroidbridge">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true">
        <activity
            android:name="com.unity3d.player.UnityPlayerActivity"
            android:label="@string/app_name"
            android:launchMode="singleInstance">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
                <category android:name="android.intent.category.ARLAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

还有一点需要注意的是,需要拷贝unity的classes.jar至安卓工程的libs下,再右键Add As Library,classes.jar在D:\Program Files (x86)\Unity5.3.6\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes下。

3.这样安卓工程的准备工作就完成,在顶部导航栏中,点击Build->Make project之后,在工程目录app->build->outputs->aar文件夹下,有一个app-debug.aar包,拷贝至unity工程,Plugins->Android->libs,并且用7z工具打开,删除libs中的classes.jar即可。同时拷贝AndroidManifest.xml至Plugins->Android目录下。这样最简单的unity调用安卓,安卓调用unity就完成了,具体可以看两个脚本中的方法。

最后附上两个工程和简单使用的网盘地址:

https://pan.baidu.com/s/1wSV_-QTzEQwn5MWrXP9NGw

密码:zt4a

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值