关注下面的订阅号免费查看完整版,完整版更详细哦!!

 

 

 

本文主要介绍的是AS 和 Unity 之间如何通信。AS 和 Unity 之间通信有两种方法先介绍如下:

1、将 Unity 项目导出为Android工程,然后在Android Studio(以后简称为AS)中进行二次开发,添加扩展功能。这样的方式开发起来很灵活,改动起来也很方便,但是就是很麻烦,因为每次改动都要打一回安卓工程。

2、将AS中的扩展功能制作成 Android 库文件(jar包或者aar),然后将jar/aar包导入到 Unity 中直接使用,这样的方式使用者无法修改这个库文件的功能,但也更便于使用 。

下面我将分两步介绍如何利用第二种方法实现AS 和 Unity 之间的通信

第一部分AS 需要做的工作

1.创建正常 AS 库工程

首先创建一个AS 项目

 

然后修改创建好的应用为库编译模式需要修改的点如下:

 

  1. build.gradle文件修改

 

 

  1. 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 编译范围设置

 

 

 

设置后目录列如下:

 

  1. 删除AS 项目中res中的资源,否则Unity编译会报错

 

 

 

 

 

以上图片选中的均删除掉即可

 

 

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

 

 

 

 

更多相关文章

  1. Android从驱动层到应用程序层的通信
  2. Android(安卓)驱动和系统开发 2. 解析模拟器GPS模块 (原创)
  3. Android(安卓)5.0 Lollipop 短彩信接收流程
  4. android调用webservice实现手机归属查询
  5. 基于jsBridge的NA与H5交互
  6. Android(安卓)将Activity打成jar包供第三方调用
  7. Android回调函数机制那点事
  8. 关于Volley的问题,GET方式下输入有空格的参数居然解析错误,导致不
  9. android DexClassLoader动态加载技术详解

随机推荐

  1. 如何让自己的网站免费从HTTP升级为HTTPS?
  2. Dynamics 365新特性介绍:在视图中显示图片
  3. 日志分析工具Log Parser介绍
  4. Dynamics CRM Web API中的and和or组合的
  5. 介绍Dynamics 365 Performance Center
  6. 介绍Dynamics 365的OrgDBOrgSettings工具
  7. 为Dynamics 365写一个简单程序实现解决方
  8. JWT可以很好的应用在restful api模式上
  9. Dynamics 365 Customer Engagement中插件
  10. 自定义工作流活动运行产生System.Securit