Unity与Android调用交互

2021-08-12 11:17:05 浏览数 (1)

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 上跑哦,必须在手机上跑哦!!!!

0 人点赞