unity 和安卓的交互方式 学习笔记 (接SDK等使用)

2 篇文章 0 订阅
2 篇文章 0 订阅

首先要理解 android 每一个界面 都是一个Activity,untiy apk 所有内容做成一个MainActivity 只有这一个界面。

主要有三种方法:  一下生成插件方法基于android studio(eclipse自行测试原理是一样的)

1:在MainActivity 中扩展方法
2:在安卓中导出一个插件Plugins 导出jar包 aar包
3:C#调用原生java方法

这三种方法中调用 unity 安卓交互方式是一样的只是生成的插件形式不一样  这里先简单介绍交互方式。下面也有一起介绍

1:unity 调用 安卓里面的方法接口

//获得位于com.untiy3d.player 包下面的类
AndroidJavaClass  jc = new AndroidJavaClass("com.untiy3d.player.UnityPlayer");
//获取这个类里面的 currentActivity对象
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("ddd") --没有返回值 第一个参数是android里面写的方法名 后面参数是 函数参数列表
jo.Call<int>("add",4,5);  --有返回值 <返回值类型>

2:android 中是一个 静态方法
public static int add(int a,int b)
{
}

//获得test 类 包名+类名
AndroidJavaClass jc = new AndroidJavaClass("com.temp.ee.SimpleClass.Test");
jc.CallStatic<int>("add",1,2) 类直接调用函数

3:Android调用Unity
1: 在untiy C# 写一个公共方法  ChangeColor()
2:在android  MainActivity中 修改方法
public int add (int a,int b)
{
    //Main Camera 脚本挂在哪个游戏物体上  ChangeColor函数名称 "" 参数 没有就是空字符串
    UnityPlayer.UnitySendMessage("Main Camera","ChangeColor","") 
}

首先介绍 导出jar包 (unity 新版本官方不推荐)

1:创建一个android 空工程
2:File ->New ->NewModule ->Android Library ...
3:在工程目录 java 第一个创建文件夹 创建-》New-》EmptyActivity 创建
4:删掉layout activity_main.xml 然后再 MainActivity 里面OnCreate删除 setContentView(R.layout.activity_main)
5:导入  unity 安装目录-》Editor->Data->PlaybackEngines->AndroidPlayer->Variations->mono->Release->Classes-》classes.jar
到项目工程 libs文件夹下  点击classes.jar右键 -》Add As Libray 添加到当前项目工程 包可展开看见里面的东西就是导入成功
6: 项目工程 -》manifests 文件夹 -> AndroidManifest.xml(安卓的一个清单 配置一些权限,页面配置等)
7:MainActivity  继承extends UnityPlayerActivity 
8:写方法 
9:选择当前工程文件 Build-》Make Module "testProject"(工程名) 开始编译
10:编译完成 -》工程目录-》Build -》intermediates->bundles->debug->
debug 文件夹下的->libs文件夹下->classes.jar 删除(因为这个是从untiy 复制过来的)把debug文件夹下的classes.jar复制到libs文件夹下(刚刚扩展的)
把libs 和res文件夹复制出来备用
11:然后再找到Build -》intermediates->manifests ->androidMainfest.xml (注意改里面的包名和unity包名一致) 复制出来备用
12:创建untiy工程+选择安卓平台 ,填写和androidmainfest.xml一样的包名 
13:在assest文件夹下创建Plugings->Android (最后把刚刚的libs +res +AndroidManifest拖入到android文件夹下)
14:使用 Unity 调用安卓 AndroidJavaClass 可以调用anndroid里面的一个类 (填写类的包名)
//获得位于com.untiy3d.player 包下面的类
AndroidJavaClass  jc = new AndroidJavaClass("com.untiy3d.player.UnityPlayer");
//获取这个类里面的 currentActivity对象
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("ddd") --没有返回值 第一个参数是android里面写的方法名 后面参数是 函数参数列表
jo.Call<int>("add",4,5);  --有返回值 <返回值类型>

导出aar包 (通用官方推荐) 相互调用还是一样的

1:选择当前工程文件 Build-》Make Module "testProject"(工程名) 开始编译
2:当前工程文件 Build-》outputs->arr文件夹-》testProject-debug.aar包 拷贝到桌面上 (其实是一个zip的压缩文件)
3:AndroidManifest.xml 复制一份
4:使用压缩文件打开 但是不解压 (其实还是帮我们做好的jar)在libs下面的classes.jar 使用最外面一层的classes.jar 替换掉 
5:把 复制 的AndroidManifest.xml放到Unity工程android 里面
6:修改压缩文件下的AndroidManifest.xml   下面的删除掉(会和放在untiy里面的冲突)包名不用改
<application>
    android:icon = "@mipmap/icon" --app图片
    android:label = "unity/testLibray" --app手机显示名字
</application>
修改完再放到压缩文件下
7:untiy里面的 AndroidManifest.xml 需要和unity 包名一样 并且更改 图标和名字
8:复制两个文件 aar+AndroidManifest.xml  到unity 

提供额外的类 +Java (安卓写接口不需要任何资源就可用该方式)

1:创建一个新的工程 + EmptyActivity
2:File ->New ->NewModule ->Android Library ...(SimpleClass)

//这个是为了安卓调用unity 而做的,如果不在安卓里面调用unity 就不用做
3:导入  unity 安装目录-》Editor->Data->PlaybackEngines->AndroidPlayer->Variations->mono->Release->Classes-》classes.jar
到项目工程SimpleClass libs文件夹下  点击classes.jar右键 -》Add As Libray 添加到当前项目工程 包可展开看见里面的东西就是导入成功


4:SimpleClass->Java->右键 New ->JavaClass  -》类名  写公共方法
5:选择当前工程文件SimpleClass Build-》Make Module "SimpleClass"(工程名) 开始编译
6:选择jar包 编译完成 -》工程目录-》Build -》intermediates->bundles->debug->debug 文件夹下的->classes.jar (这个时候选择的是直接外面的classes.jar)
7:classes.jar 直接复制到Unity 工程Android 文件夹下 (名字是随便更改 test)
8:使用 直接生成一个类的对象
//需要给构造方法填参数的话就要在后面添加参数 否则默认的构造方法
AndroidJavaObject jo = new AndroidJavaObject("com.temp.ee.SimpleClass.Test") java类的包名.Test类名
jo.Call<int>("add",1,3)  调用是一样的

纯C#调用android (不需要android 导出包需要对android 熟悉不熟悉可以转到定义去查看)

因为untiy 发布的工程会包含androidSdk 所以androidSdk的原生方法可以用

1:调用android的log.e() 方法 先找到所在的包和类
2:使用方法
AndroidJavaClass jc = new AndroidJavaClass("android.util.Log");
jc.CallStatic<int>("e","UnityAndroidTest","ErrorTest");

在untiy 页面显示一个 android 文本框

//先找到android 方法的包和类名 
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")  //Activity 
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")

AndroidJavaClass toast = new AndroidJavaClass("android.widget.Toast");

//获得当前上下文

AndroidJavaObject context = currentActivity.Call<AndroidJavaObject>("getApplication") 

 

//runOnUiThread android ui 线程
currentActivity.Call("runOnUiThread",new AndroidJavaRunable(()=>{
    //匿名方法  LENGTH_LONG 
    toast.CallStatic<AndroidJavaObject>("makeText",context,"Send From Unity",toast.GetStatic<int>("LENGTH_LONG")).Call("Show")
}));
//C# 调用安卓接口
先定义一个内部类 继承 AndroidJavaProxy
class DateCallBack:AndroidJavaProxy
{
    //指定这个类模拟 OnDateSetListener 接口  android.app.DatePickerDialog包名类名 +$+ 接口名
    public DateCallBack():base("android.app.DatePickerDialog$OnDateSetListener")
    {
        
    }
    
    void onDateSet(androidJavaObject view,int year,int month,int dayofmonth)
    {
        
    }
}

接入SDK 讯飞语音

接入一个SDK 首先要看官方demo 后面就是在安卓里面写方法接口 到unity 里面去用 
1:官网下载注册
2:同上创建新工程
3:File ->new -> import Module ->选择资源文件 (有的xfTest->speechDemo ->build.gradle 修改平台可能android平台版本不符报错)


开始接入
1:File ->New -> New Module ->Android Library
2:把讯飞语音 msc.jar 复制到 libs下 unity 的Classes.jar 复制 跟上面是一样的原理    右键add as library
3:检查依赖是否导入 右键工程文件名 -> Open Module Settings
4:在工程文件 ->src->main->创建一个新的文件夹 jniLibs 把 现在的SDk工程文件 中libs 下的armeabi-v7a拷贝过去 在用到的SDK里面的类或者工具类等没有的时候直接从Demo工程目录里面拷贝到对应目录就行
5:工程文件-》java->第一个文件创建 New ->Activity ->EmptyActivity
6:删掉layout activity_main.xml 然后再 MainActivity 里面OnCreate删除 setContentView(R.layout.activity_main)
8: 项目工程 -》manifests 文件夹 -> AndroidManifest.xml(安卓的一个清单 配置一些权限,页面配置等)
9:MainActivity  继承extends UnityPlayerActivity 
10:初始化语音引擎 自己写一些公共函数给unty 用 或者在这边的回调函数里面回调untity 里面写的方法 对应SDk 里面的方法都有或者百度

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值