Android Unity 交互

Android Unity 交互

系列篇一
所有篇幅
Unity Android 交互
Unity Android 交互二
Unity Android 交互三 多 aar 接入 Unity 自动合并多个 AndroidManifest.xml
Unity Android SDK 接入 讯飞 SDK 实战

之前使用 Eclipse 导出 jar 包导入 Unity 交互,下面使用 Android Studio 生成 arr 导入Unity 中交互

1.打开 Android Studio 随意创建一个 Project(此处无用,只是用来打开Android Studio 并且有一个 Project)

2.创建一个 Module

第一步创建的是一个 Project,这一步创建的是 Module。Android Studio 中 Project 和 Module 的区别可以在网上查,在此简单说下,一个工作目录 Project 对应了一个文件夹,在这个文件夹下可以放多个 Android 项目(Module就相当于一个Android项目)如下
这里写图片描述

File –> New -> New Module
这里写图片描述

此处选择了 Phone
这里写图片描述

修改默认包名和 Unity 项目中 Bundle Identifier 一致,选择 API 版本
这里写图片描述

创建一个 Empty Activity
这里写图片描述

确认一个主Activity名,我在此就用默认的 MainActivity 了,确认布局文件 Layout 名,在此也使用默认的 activity_main.xml了
这里写图片描述

创建完成后需要等待Android Studio 自动编译,编译完成没有报错
这里写图片描述

Src -> androidTest、Src -> test 为自动生成的测试文件,用不到直接删除

Src-> main->res 会有一些配置文件,布局文件等,也用不到
这里写图片描述

删除后
这里写图片描述

colors.xml、 strings.xml、strles.xml 都清空了
这里写图片描述

这里写图片描述

这里写图片描述

打开布局文件 activity_main.xml
这里写图片描述

TextView 就不需要了直接删除

打开 AndroidManifest.xml
这里写图片描述
上面变红的都是刚才删掉的,将manifest.xml中红色的删除
最终如下

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

    <application
        android:allowBackup="true"
        android:supportsRtl="true"
        >
        <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>

下面测试生成 aar

修改 build.gradle
这里写图片描述

打开 build.gradle
这里写图片描述

手动修改 apply plugin: 'com.android.application'apply plugin: 'com.android.library'

手动删除applicationId "com.librarytwo.deom"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

引用库通过下面方法删除
选择 mylibraytwo 右键 Open Module Setting 删除无用引用

这里写图片描述

弹出窗口, 左侧选择 mylibrarytwo 右上角选择 Dependencies
这里写图片描述

再打开 build.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 26

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
}

发现 dependencies 里边的引用库自动删除了

自动编译结束 MainActivity.java 报错,
这里写图片描述

查看发现引用库 import android.support.v7.app.AppCompatActivity; 报错
MainActivity 继承于AppCompatActivity

直接将 import android.support.v7.app.AppCompatActivity; 删除将 ,修改 MainActivity 继承于 Activity

public class MainActivity extends Activity

结果如下

package com.librarytwo.deom;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }
}

选择 mylibrarytow 菜单栏 Build -> Build APK
这里写图片描述

执行成功再 mylibrarytow -> build ->outputs -> aar 文件下生成 arr
这里写图片描述

上面生成一个 debug.aar 想要生成 release 修改配置
Android Studio 左下角 BuildVariants,
这里写图片描述

修改为 release 后 执行 Build -> Clear Project 等执行成功然后 Build -> Rebuild Project
生成一个 release.aar
这里写图片描述

到此测试生成 aar 成功

下面开始 Unity 交互
添加类库:Unity 自带AndroidUnity交互的类库classes.jar
使用Mono 打包 APK 就要使用 Mono 下类库
Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\ classes.jar

使用IL2CPP 打包APK 则使用 il2cpp 下类库

Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes\ classes.jar

复制classes.jar 到 libs 文件夹
这里写图片描述

设置对 classes.jar 的引用 选择 Module 右键 Open Module Setting
这里写图片描述

和刚才删除引用库基本一样,选择右上角 + 号,选择 jar dependency
这里写图片描述

这里写图片描述

打开 build.gradle dependencies 中自动添加了一行,说明对 classes.jar 的引用

dependencies {
    implementation files('libs/classes.jar')
}

修改ManiActivity.java

package com.librarytwo.deom;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.widget.Toast;

import com.unity3d.player.UnityPlayer;         // 添加引用
import com.unity3d.player.UnityPlayerActivity;


public class MainActivity extends UnityPlayerActivity {  // 继承于 UnityPlayerActivity

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    // 显示一个对话框
    // 返回 String
    // _title   对话框标题
    // _content 对话框显示内容
    public String ShowDialog(final String _title, final String _content)
    {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle(_title).setMessage(_content).setPositiveButton("OK", null);
                builder.show();
            }
        });

        CallUnity("TestAndroid", "AndroidCall", "我是Android");

        return _title + _content;
    }

    // 返回两个数相加的和
    public int AddNumber(final int number1, final int number2)
    {
        return  number1 + number2;
    }

    // 调用 Unity
    // gameObjectName 为接受消息的Unity 中 GameObject 的名字
    // functionName   为接受消息的GameObject 挂载 C# 脚本中的函数名
    // _content       为发送给Unity 的内容
    public void CallUnity(String gameObjectName, String functionName, String _content)
    {
        UnityPlayer.UnitySendMessage(gameObjectName, functionName, _content);
    }
}

生成 aar
找到 mylibrarytow-release.aar用解压工具打开,删除掉 libs 下的 classes.jar

这里写图片描述

Unity 打包APK 时会将 classes.jar 重新加入到 APK 中,不删除 classes.jar打包时会冲突报错

IOException: Failed to Move File / Directory from 'Temp/StagingArea\android-libraries\mylibrarytow-release\classes.jar' to 'Temp/StagingArea\android-libraries\mylibrarytow-release\libs\classes.jar'.

这里写图片描述
然后解压arr 获取 AndroidManifest.xml

mylibrarytow-release.aarAndroidManifest.xml
放到 Unity 项目 Plugins -> Android目录下

Unity 创建和 arr 交互的 C# 脚本,代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TestLibraryTow : MonoBehaviour {
    public Text text;

    public Button addButton;
    public Button showDialogButton;

    // Use this for initialization
    void Start () {
        addButton.onClick.AddListener(AddOnClick);
        showDialogButton.onClick.AddListener(ShowDialogOnClick);
    }

    private void AddOnClick()
    {
#if UNITY_ANDROID
        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) // Android 的 Java 接口
        {
            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                int result = jo.Call<int>("AddNumber", 100, 200);
                SetText(result.ToString());
            }
        }
#endif
    }

    private void ShowDialogOnClick()
    {
#if UNITY_ANDROID
        using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) // Android 的 Java 接口
        {
            using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
            {
                string str = jo.Call<string>("ShowDialog", "标题", "Hello World");
                SetText(str);
            }
        }
#endif
    }

    public void AndroidCall(string value)
    {
        SetText(value);
    }

    private void SetText(string content)
    {
        text.text = content;
    }

}

打包 APK 在模拟器上运行测试
这里写图片描述

点击 Add 按钮 文本变为 300 测试成功
这里写图片描述

点击 ShowDialog 按钮 弹出对话框,文本变为 我是Android 测试成功
这里写图片描述

### 回答1: AndroidUnity之间的交互可以实现在Unity运行时,调用Android原生代码来实现一些功能。在Android端可以使用 Android Java API 调用 Unity 的代码。而在Unity端,可以使用 C# 代码来调用 Android 的 Java API。这种双向调用可以实现一些比较复杂的跨平台应用,例如在Unity中展示Android硬件设备的信息或者调用相机、传感器等硬件设备来实现某些功能。 例如,在Android端上获取某个传感器的数据,然后传到Unity中,就可以借助Java Native Interface(JNI)来实现。具体实现方式如下: 1. Android端: * 创建一个Native方法,在其中读取传感器数据; * 创建一个Java类,将该Native方法和Unity相关的方法绑定; * 在Unity中调用Java类中的方法,以获取传感器数据。 2. Unity端: * 在C#代码中,调用Android的Java API,以实现数据传输; * 实现Unity的渲染逻辑,以展示从Android端传输过来的数据。 需要注意的是,为了确保代码的正确性和稳定性,一定要在调用之前做好详细的测试工作。 ### 回答2: AndroidUnity是两个流行的软件开发平台,它们都具有广泛的应用。将它们结合起来,可以为应用开发者带来无限的可能性。 在androidunity交互过程中,最主要的问题是如何将android中的数据传递到unity中。这主要分为两种情况:一种是在Unity中使用安卓API(Java代码),另一种是安卓使用Unity中的可编程元素(C#代码)。 在第一种情况下,可以使用Unity的Java接口来实现,编写类似于以下的Java代码: ``` UnityPlayer.UnitySendMessage("GameObjectName", "MethodName", "Message"); ``` 其中,UnitySendMessage方法将消息发送给Unity中的一个GameObject,它接受两个参数,分别是接受消息的对象名和它上面的方法名。 在第二种情况下,可以使用Unity的C#接口来实现。我们可以使用Unity中的SendMessage或BroadcastMessage方法来向Unity对象发送消息(这些对象必须具有MonoBehaviour脚本,否则将不会工作)。 在Android中使用Unity对象也同样简单。我们需要做的就是在Android项目中添加UnityPlayerActivity类,在此类中使用UnityPlayer类的相关方法调用Unity导出的API。 综上所述,将安卓与Unity结合起来,可以极大地扩展应用的功能性,并为用户提供更好的体验。通过上述方法可以轻松实现androidunity交互。 ### 回答3: AndroidUnity交互是现在游戏开发中非常常见的一种技术,Android作为手机操作系统的代表,提供了丰富多彩的开发接口,而Unity作为一款游戏引擎,具有着强大的游戏制作功能。两者合作可以大大提高游戏的交互性和玩法。下面我们来分别了解一下AndroidUnity之间的交互方式。 首先是从AndroidUnity交互。由于Android系统是Java语言开发的,而Unity则是C#开发的,所以两者之间实现交互还需要一些中间的桥梁。目前比较常用的方式是通过JNI接口,将Java层面的信息传递到C#层面的Unity中。在Java中,你需要先获取UnityPlayer的实例,然后就可以通过UnityPlayer的方法来调用C#端的函数。具体流程如下: 1. 在Unity中编写对应的C#函数,该函数必须使用静态修饰符(static)。例如: public static void UnityMethod(string str){ Debug.Log("接收到的数据为:" + str); } 2. 在Java中,使用JNI接口调用C#函数。例如: // 获取UnityPlayer实例 UnityPlayer player = new UnityPlayer(); // 调用C#函数 player.UnitySendMessage("GameObject名字", "函数名字", "传递的参数"); UnitySendMessage方法中,第一个参数表示的是GameObject的名字,第二个参数表示的是C#函数的名字,第三个参数就是传递的参数。 其次是从UnityAndroid交互。在Unity中,通过AndroidJavaClass和AndroidJavaObject等API,可以实现调用Java层面的方法。具体流程如下: 1. 在Java中,编写需要调用的方法,这里的方法必须是public静态的。例如: public static void showAndroidToast(String msg){ Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } 2. 在Unity中,使用AndroidJavaClass和AndroidJavaObject等API来调用Java方法。例如: // 设置Context AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); // 调用Java方法 AndroidJavaClass cls = new AndroidJavaClass("com.example.androidTest.MainActivity"); cls.CallStatic("showAndroidToast", currentActivity, "传递的参数"); CallStatic方法中,第一个参数表示要调用的Java层面类的名称,第二个参数表示要调用的Java方法名称,接下来的参数就是要传递的参数。 综上所述,通过JNI和AndroidJavaClass等API,AndroidUnity之间可以很方便地进行交互,相互传递数据和调用各自的方法。这样就能够更好地完成游戏逻辑和UI界面的制作。同时,这种交互方式也为跨平台的开发提供了很好的经验和方法。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值