Unity与Android通信
前言
目前网上找到的相关文章都是互相转发抄袭,真的毫无阅读价值,如此简单的通信竟然花了我好几天的功夫学习,故做此记录
Android层
准备
环境配置相关的内容就不介绍了
创建一个空项目
下面配置可以随便写,不会用到,但还是规范一点吧!
创建项目,等待Gradle Sync,切记不要使用代理,不要使用代理,也不要开梯子!
右键项目,创建一个new module,选择library
这里的package name要和unity中设置一致,API等级大于11
然后我们把创建工程自带的app module删掉,当然直接删是删不掉的,得在这
同事删除MySDK的所有依赖
删除安卓自带的一些资源文件,只留下main就好
到此为止安卓方面的一个空项目算是准备好了
编写SDK
安卓肯定是不认识UNIYT的,所以我们得导入UNITY官方给我们的一个JAR包作为桥梁,找到对应编辑器的安装目录
这其中有2个文件夹,得看你的UNITY项目选择打包成mono还是il2cpp,这里我们选择mono,则继续往下找
将他复制到AS对应目录,并添加为Library
在main目录中的package中创建一个JAVA类,集成自Fragment,有同名类,注意命名空间
编写代码
package com.banging.mysdk;
import android.app.Fragment;
import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
public class MyPlugin extends Fragment
{
private static final String TAG = "MyPlugin";
private static MyPlugin Instance = null;
private String gameObjectName;
public static MyPlugin GetInstance(String gameObject)
{
if(Instance == null)
{
Instance = new MyPlugin();
Instance.gameObjectName = gameObject;
// 大概是默认写法,这里不是很明白
UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(Instance, TAG).commit();
}
return Instance;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setRetainInstance(true); // 这一句很重要,保存对该Fragment的引用,防止在旋转屏幕等操作时时丢失引用(Fragment隶属于Activity)
}
//示例方法一:简单的向Unity回调
public void SayHello()
{
UnityPlayer.UnitySendMessage(gameObjectName,"PluginCallBack","Hello Unity!");
}
//示例方法二:计算传入的参数并返回计算结果
public int CalculateAdd(int one, int another)
{
return one + another;
}
}
很简单的能够发现,这是一个单利类,提供给Unity调用
Build项目,找到编译好的arr,复制到Unity项目的Assets/Plugins/Android中
Unity层
用解压缩软件打开arr,删除两个东西
新建一个测试场景
新建一个脚本挂到Canvas上
using System;
using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour
{
public Text callbackText = null;
public Text resultText = null;
private AndroidJavaClass jc;
private AndroidJavaObject jo;
void Start()
{
// 这里就是我们的定义在安卓中的的包名+类名
// 获取到一个类,只是类,不是实例
jc = new AndroidJavaClass("com.banging.mysdk.MyPlugin");
// 调用静态方法获取单例类
jo = jc.CallStatic<AndroidJavaObject>("GetInstance", gameObject.name);
try
{
jo.Call("SayHello");
}
catch (Exception e)
{
callbackText.text = e.ToString();
}
try
{
resultText.text = jo.Call<int>("CalculateAdd", 2, 3).ToString();
}
catch (Exception e)
{
resultText.text = e.ToString();
}
}
// 安卓向Unity发送的消息
public void PluginCallBack(string text)
{
callbackText.text = text;
}
}
打包设置,公司名必须改一个,使用默认的可能打包出错
这两个需要和安卓那边设置一样,不一样好像也可以,没有过多测试,目前先保持一致!
打包,测试
更新
现在可以直接把JAVA文件丢到Android/Plugins中…根本不需要AS打包…
易错点
Gradle Sync 特别慢
不要使用代理,首先检查是否打开了代理
这里分两种情况,如果你之前曾经设置过代理,哪怕你取消了,仍然会有残留配置,检查gradle.properties,图中红框内应该会有对应的代理信息,删掉
其次,如果你配置过代理并且主动Sync过,AS应该会有一个弹窗让你确定代理设置,此时会在 C:\用户\(你的用户名)\.gradle 中生成一个gradle.properties,其中也会有代理信息,删掉,然后重启AS,注意一定要重启
如果你之前没有配置过代理,但是Build也很慢,那可以考虑随便设置一个代理,然后主动Sync,让AS保留代理配置,生成相关文件,然后你再删掉,重复上一步的操作,然后重启
Android Gradle plugin requires Java 11 to run.
本地JAVA环境版本太低了,直接点击图中的Gradle Settings设置成对应版本就好,似乎AS默认就是安装了JAVA11的