2.Unity调用Android

2.Unity调用Android


2.1 知识点

准备工作

在AndroidStudio中的MainActivity中加入测试用的成员变量

package com.tao.unityandroidtestgame;

import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {

    // 测试成员变量
    public int testI;
    public static int testStaticI;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
    }

    // 测试成员函数
    public String TestFun() {
        return "String";
    }

    // 测试静态函数
    public static String TestStaticFun() {
        return "TestStaticFun";
    }
}

修改后要重新生成aar包

导入AndroidStudio生成的内容

在Unity中新建 Plugins/Android 插件文件夹,将AndroidStudio生成的内容放入该文件夹中。

  1. 导入aar包

  2. 导入AndroidManifest.xml配置文件

在Unity中书写交互代码

测试准备的UGUI文本

// 这些代码在PC使用Unity的Debug.Log是看不到的,要用UGUI发布后进行测试
public Text txtOld;
public Text txtNew;
public Text txtStaticOld;
public Text txtStaticNew;
public Text txtTestFun;
public Text txtTestStaticFun;

交互代码

androidJavaObject.Get<变量类型>(“变量名”) 成员变量的获取

androidJavaObject.Set<变量类型>(“变量名”, 值) 成员变量的赋值

androidJavaObject.GetStatic<变量类型>(“变量名”) 静态变量的获取

androidJavaObject.SetStatic<变量类型>(“变量名”, 值) 静态变量的赋值

androidJavaObject.Call(“函数名”, 参数) 无返回值成员函数调用

androidJavaObject.Call<返回值类型>(“函数名”, 参数)有返回值成员函数调用

androidJavaObject.CallStatic(“函数名”, 参数) 无返回值静态函数调用

androidJavaObject.CallStatic<返回值类型>(“函数名”, 参数)有返回值静态函数调用

void Start()
{
    // 固定写法
    // 创建和Android通信的类信息
    using (AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
    {
        // 获取当前Unity基于的Activity对象
        // 这里得到的对象就相当于是aar包中的MainActivity
        // 当前这个JavaObj就代表MainActivity这个对象,我们可以通过它获取到其中的变量、方法
        using (AndroidJavaObject androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity"))
        {
            // 获取到MainActivity后,就可以调用其中的对应Java代码了
            
            // 变量相关
            
            // 1. 成员变量的获取和设置
            // androidJavaObject.Get<变量类型>("变量名")
            // androidJavaObject.Set<变量类型>("变量名", 值)
            
            // 成员变量的获取和改变
            int i = androidJavaObject.Get<int>("testI");
            txtOld.text = i.ToString();
            
            androidJavaObject.Set<int>("testI", 11);
            i = androidJavaObject.Get<int>("testI");
            txtNew.text = i.ToString();
            
            // 2. 静态成员变量的获取和设置
            // androidJavaObject.GetStatic<变量类型>("变量名")
            // androidJavaObject.SetStatic<变量类型>("变量名", 值)
            
            // 静态成员变量的获取和改变
            int staticI = androidJavaObject.GetStatic<int>("testStaticI");
            txtStaticOld.text = staticI.ToString();
            
            androidJavaObject.SetStatic<int>("testStaticI", 21);
            staticI = androidJavaObject.GetStatic<int>("testStaticI");
            txtStaticNew.text = staticI.ToString();
            
            // 函数相关
            
            // 1. 成员函数调用
            // 无返回值
            // androidJavaObject.Call("函数名", 参数)
            // 有返回值
            // androidJavaObject.Call<返回值类型>("函数名", 参数)
            
            // 调用有返回值的成员函数
            string testFunStr = androidJavaObject.Call<string>("TestFun");
            txtTestFun.text = testFunStr;
            
            // 2. 静态成员函数调用
            // 无返回值
            // androidJavaObject.CallStatic("函数名", 参数)
            // 有返回值
            // androidJavaObject.CallStatic<返回值类型>("函数名", 参数)
            
            // 调用有返回值的静态函数
            string testStaticFunStr = androidJavaObject.CallStatic<string>("TestStaticFun");
            txtTestStaticFun.text = testStaticFunStr;
        }
    }
}

打包注意事项

打包秘钥设置(非中文路径):



aar包设置(直接打包会报错,根据打包报错提示来处理,一般由以下几步需要处理):

在资源管理器使用解压软件打开aar包

删除aar包中 libs下的classes.jar,因为Unity会自带,避免重复报错

删除aar包中 classes.jar 中的 UnityPlayerActivity.class,因为Unity会自带,避免重复报错,删除unity3d文件夹


假如还是相同报错,可能是Unity还没反应过来,检查是否删除干净后重新生成app,会出现其他报错

删除aar包中 classes.jar 中的 BuildConfig.class,通过Unity打包不需要构建配置

作为以上操作后正常可以打包成功

安装测试

在真机或者虚拟机上安装打包的应用进行交互测试,可以正常读取和修改变量,且能调用函数

总结

Unity调用Android代码需要注意:

  1. 固定的API写法
  2. 打包报错处理

2.2 知识点代码

MainActivity

package com.tao.unityandroidtestgame;

import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {

    //测试成员变量
    public int testI;
    public static int testStaticI;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
    }

    //测试成员函数
    public String TestFun()
    {
        return "String";
    }

    //测试静态函数
    public static String TestStaticFun()
    {
        return "TestStaticFun";
    }
}

Lesson02_Unity调用Android

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

public class Lesson02_Unity调用Android : MonoBehaviour
{
    //这些代码在PC使用Unity的Debug.Log是看不到的,要用UGUI发布后进行测试
    public Text txtOld;
    public Text txtNew;
    public Text txtStaticOld;
    public Text txtStaticNew;
    public Text txtTestFun;

    public Text txtTestStaticFun;
    
    void Start()
    {
        #region 准备工作

        //在AndroidStudio中的MainActivity中加入测试用的成员变量

        #endregion

        #region 知识点一 导入AndroidStudio生成的内容

        //在Unity中新建 Plugins/Android 插件文件夹
        //将AndroidStudio生成的内容 放入该文件夹中
        //1.导入aar包
        //2.导入AndroidManifest.xml配置文件

        #endregion

        #region 知识点二 在Unity中书写交互代码

                //固定写法
        //创建和Android通信的类信息
        using (AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))//com.unity3d.player.UnityPlayer是固定写法
        {
            //获取当前Unity基于的Activity对象
            //这里得到的对象就相当于是aar包中的MainActivity
            //当前这个JavaObj就代表MainActivity这个对象 我们可以通过它获取到其中的变量、方法
            using (AndroidJavaObject androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity"))//currentActivity是固定写法 获取当前激活的Activity
            {
                //获取到MainActivity后 就可以调用其中的对应Java代码了

                //变量相关
                
                //1.成员变量的获取和设置
                //androidJavaObject.Get<变量类型>("变量名")
                //androidJavaObject.Set<变量类型>("变量名", 值)

                //成员变量的获取和改变
                int i = androidJavaObject.Get<int>("testI");
                txtOld.text = i.ToString();

                androidJavaObject.Set<int>("testI", 11);
                i = androidJavaObject.Get<int>("testI");
                txtNew.text = i.ToString();
                
                
                //2.静态成员变量的获取和设置
                //androidJavaObject.GetStatic<变量类型>("变量名")
                //androidJavaObject.SetStatic<变量类型>("变量名", 值)

                
                //静态成员变量的获取和改变
                int staticI = androidJavaObject.GetStatic<int>("testStaticI");
                txtStaticOld.text = staticI.ToString();

                androidJavaObject.SetStatic<int>("testStaticI", 21);
                staticI = androidJavaObject.GetStatic<int>("testStaticI");
                txtStaticNew.text = staticI.ToString();
                
                
                //函数相关
                
                //1.成员函数调用
                //无返回值
                //androidJavaObject.Call("函数名", 参数)
                //有返回值
                //androidJavaObject.Call<返回值类型>("函数名", 参数)

                //调用有返回值的成员函数
                string testFunStr = androidJavaObject.Call<string>("TestFun");
                txtTestFun.text = testFunStr;
                
                //2.静态成员函数调用
                //无返回值
                //androidJavaObject.CallStatic("函数名", 参数)
                //有返回值
                //androidJavaObject.CallStatic<返回值类型>("函数名", 参数)
                
                //调用有返回值的静态函数
                string testStaticFunStr = androidJavaObject.CallStatic<string>("TestStaticFun");
                txtTestStaticFun.text = testStaticFunStr;
            }
        }
        
        #endregion

        #region 知识点三 打包注意事项

        //基础设置:
        //1.打包密钥设置
        //2.非中文路径

        //aar包设置(根据打包报错提示来处理,一般由以下几步需要处理):
        //1.删除aar包中 libs下的classes.jar,因为Unity会自带,避免重复报错
        //2.删除aar包中 classes.jar 中的 UnityPlayerActivity.class,因为Unity会自带,避免重复报错
        //3.删除aar包中 classes.jar 中的 BuildConfig.class,通过Unity打包不需要构建配置

        #endregion

        #region 知识点四 安装测试

        //在真机或者虚拟机上安装打包的应用进行交互测试

        #endregion

        #region 总结

        //Unity调用Android代码需要注意
        //1.固定的API写法
        //2.打包报错处理

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏