AS 和 Unity 之间如何通信。AS 和 Unity 之间通信的方法介绍如下:
将AS中的扩展功能制作成 Android 库文件(jar包或者aar),然后将jar/aar包导入到 Unity 中直接使用
下面我将分两步介绍如何利用第二种方法实现AS 和 Unity 之间的通信
第一部分
Android Studio需要做的工作
1.创建正常 Android Studio 库工程
首先创建一个Android Studio 项目 然后修改创建好的应用为库编译模式需要修改的点如下:
build.gradle文件修改
Unity classes.jar拷贝到项目中libs文件夹中
找到安装的Unity文件夹,找到 途中的的classes.jar,然后将jar放到项目中libs目录下,另外Unity中有mono和il2cpp两个文件夹,这两个文件夹下都有classes.jar,具体选用大家要看你们unity 中playerSettings 中的配置
注意:build.gradle中的 target api 要和player setting中的要一致否则也会报错
要么选自动,要选具体的API值就要和build.gradle中的 target api一致
然后进行导入和设置编译范围
选中刚粘贴的classes.jar文件,右键,选择 Add as Library,出现一个弹窗口,选中自己的库模块后直接点确定
classes.jar 编译范围设置
设置后目录列如下:
删除AS 项目中res中的资源,否则Unity编译会报错
以上图片选中的均删除掉即可
AndroidManifest.xml修改 将项目中的AndroidManifest.xml修改成如下格式即可,label,包名和activity名字用自己就可以,不一定一样只要字段都一样就行,字段值不一定一样
2 AS中代码添加
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
}
//Unity 调用 Android
public void UnityCallAndroid (int a,String str) {
Toast.makeText(this,“unity调用android成功 a==” a " str==" str, Toast.LENGTH_LONG).show();
AndroidCallUnity(a,str);
}
//Android 调用 Unity
public void AndroidCallUnity (int a,String str) {
//第1个参数为Unity场景中用于接收 Android 消息的对象名称
//第2个参数为对象上的脚本的一个成员方法名称(脚本名称不限制)
//第3个参数为unity方法的参数
Toast.makeText(this,“Android 调用 Unity 成功”, Toast.LENGTH_LONG).show();
UnityPlayer.UnitySendMessage(" receiveObj", “UnityMethod”, “This is args a=” a " str=" str);
}
}
第二部分Unity的实现
1.将AS中编译的aar放到如下图中的文件夹
其中,AndroidManifest.xml 是从aar中解压出来的,具体方法是将编译出来的aar拷贝一份然后,改后缀为 zip文件后解压,拉出AndroidManifest.xml,然后再将AndroidManifest.xml,aar一起放到在Asset下新建的Plugins/Android文件夹下
2.创建一个Panel,里面放一个Image或者Button 和 Text
Image或者Button 名字要和如下方法的第一个参数名字要一致,可以自己自定义名字,我用的是receiveObj和UnityMethod
UnityPlayer.UnitySendMessage(" receiveObj(自定定义)", “UnityMethod(自已定义)”, “This is args a=” a " str=" str(自己的参数));
3.给Image或者Button 挂载C# 脚本与AS交互
挂在详情我就不写了,这个比较简单直接拖动就可以了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SDKTest : MonoBehaviour
{ private AndroidJavaClass jc;
private AndroidJavaObject jo;
public Text text;
// Start is called before the first frame update
void Start()
{ //这两行是固定写法
jc = new AndroidJavaClass(“com.unity3d.player.UnityPlayer”);
jo = jc.GetStatic(“currentActivity”);
}
//Unity 调用 Android 中的方法 UnityCallAndroid,
//将其方法绑定在Unity中的Button或者Image上,点击Button和Image就实现交互了
public void OnBtnClickHandler()
{ jo.Call(“UnityCallAndroid”,100,“Hello Unity”);
}
// 被Android中AndroidCallUnity调用
public void UnityMethod(string str)
{ Debug.Log(“UnityMethod被调用,参数:” str);
text.text = str;
}
脚本挂载
最后就可以打包运行了,将编译出来的apk 安装到Android手机上看看运行效果,不能直接在 Unity 上跑哦,必须在手机上跑哦!!!!