【Unity】Unity与安卓交互

问题描述

Unity和安卓手机进行交互,是我们开发游戏中最常见的场景。本教程将从一个简单的例子来演示一下。

本教程需要用到Android Studio2021.1.1

1.Android Studio新建一个工程

2.选择Empty Activity 然后点击Next

3.点击Finish完成创建

4.选择File-New-New Module

5.创建一个Android Library

这个就是用来生成一个jar包的

5.创建成功后,会看到刚刚创建的mylibrary和下面的build.gradle

不同视窗排版不一样,自己调整一下

6.找到Unity的classes.jar,在安装目录下

比如我的目录:C:\Program Files\Unity\Hub\Editor\2021.3.33f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes

注意选择自己需要的版本

7.拷贝到Android Studio项目中的Libs下

8.右键选择Add As Library

9.在src的main目录下,右键新增一个JavaGame脚本

10.加入以下测试脚本

java 复制代码
package com.hao.mylibrary;
import android.util.Log;
import com.unity3d.player.UnityPlayer;

public class JavaGame
{
    //初始化
    public static void Init()
    {
        // 打印: JavaGame: Init
        Log.d("JavaGame", "Init");
    }

    //获取渠道
    private String GetChannel()
    {
        Log.d("JavaGame", "GetChannel");
        return "xiaomi";
    }

    //加法
    public int Add(int num1,int num2)
    {
        Log.d("JavaGame", "Add");
        return num1 + num2;
    }

    //登录
    public static void Login()
    {
        // 打印: JavaGame: Login
        Log.d("JavaGame", "Login");

        UnityPlayer.UnitySendMessage("UnityObj", "LoginSucceed", "abc12345");
    }
}

11.打开build.gradle,添加以下打包代码

java 复制代码
task makeJar(type: Copy) {
    //删除存在的
    delete 'build/libs/testlibrary.jar'
    //设置拷贝的文件
    from('build/intermediates/aar_main_jar/release/')
    //打进jar包后的文件目录
    into('build/libs/')
    //将classes.jar放入build/libs/目录下
    //include ,exclude参数来设置过滤
    include('classes.jar')
    //重命名
    rename ('classes.jar', 'testlibrary.jar')

}

makeJar.dependsOn(build)

12.在右侧找到Gradle,选择项目中的Tasks - other - makeJar,双击makeJar开始打包

13.提示打包成功后,可在Build中的Libs下找到jar包

14.拷贝到Unity工程Plugins/Android目录下

15.在Unity里新建一个Game.cs脚本,加入以下测试代码

csharp 复制代码
using UnityEngine;
using UnityEngine.UI;
public class Game : MonoBehaviour
{
    public Text ChannelText;
    public Text AddText;
    void Start()
    {
        AndroidJavaObject javaObject = new AndroidJavaObject("com.hao.mylibrary.JavaGame");
        // 静态方法
        javaObject.CallStatic("Init");
 
        // 非静态无参方法,返回一个渠道名
        string Channel = javaObject.Call<string>("GetChannel");
        ChannelText.text = Channel;
         
        // 非静态,带参数方法
        int num = javaObject.Call<int>("Add", 2,6);
        AddText.text = num.ToString();
      
        //调用登录,登录成功会返回
        javaObject.CallStatic("Login");

    }
}

16.在Unity里新建一个UnityObj.cs脚本,并且挂在 UnityObj对象上 。

UnityObj必须要和java里的名称一致,不然Unity就接收不到java的返回

csharp 复制代码
using UnityEngine;
using UnityEngine.UI;
public class UnityObj : MonoBehaviour
{
    public Text mText;
    private void LoginSucceed(string value)
    {
        mText.text = value;
         
    }
}

17.为了方便测试,建了一个简单UI,把返回结果直接显示在UI上。

18.打包测试,使用雷电模拟器测试

相关推荐
baidu_2474386135 分钟前
Android ViewModel定时任务
android·开发语言·javascript
有位神秘人1 小时前
Android中Notification的使用详解
android·java·javascript
·云扬·1 小时前
MySQL Binlog落盘机制深度解析:性能与安全性的平衡艺术
android·mysql·adb
独自破碎E3 小时前
【BISHI9】田忌赛马
android·java·开发语言
AC梦3 小时前
unity中如何将UI上的字高清显示
ui·unity
代码s贝多芬的音符4 小时前
android 两个人脸对比 mlkit
android
darkb1rd6 小时前
五、PHP类型转换与类型安全
android·安全·php
gjxDaniel6 小时前
Kotlin编程语言入门与常见问题
android·开发语言·kotlin
csj506 小时前
安卓基础之《(22)—高级控件(4)碎片Fragment》
android
峥嵘life7 小时前
Android16 【CTS】CtsMediaCodecTestCases等一些列Media测试存在Failed项
android·linux·学习