栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

unity android交互

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

unity android交互

参考博客:
Unity与android互调用
Unity打包Android最全攻略(含完整流程及常见问题)
Unity3d接入安卓aar详细过程
Unity端使用aar包的多种方式

首先在交互的时候我们首选需要搞清楚android和unity的基本数据的映射关系:

Java 类型C# 类型
基本类型,比如 int, boolean对应的值类型 int, bool
Stringstring
数组类型数组类型 (不能是多维数组)
其他继承自 Object 的类型AndroidJavaObject

所以在提供的接口的时候,一定要遵循上面的规则,否则会调用失败。

下面以不继承UnityPlayerActivity的方式实现aar


新建包名为:**com.stdemo.stsdk**添加对外的类:Androidapi

package com.stdemo.stsdk;

import com.unity3d.player.UnityPlayer;

public class Androidapi {
    private static String TAG = "Androidapi";

    private Activity _activity;
    private static Androidapi _instance;

    public static Androidapi instance(){
        if (_instance == null){
        	//UnityPlayer.currentActivity表示当前正在显示的Unity Activity
        	//作为context使用,例如toast函数。
            _instance = new Androidapi(UnityPlayer.currentActivity);
        }
        return _instance;
    }

    public Androidapi(Activity activity){
        _activity = activity;
    }
    
	public void toast(String msg){
        Log.i(TAG,"toast:" + msg);
        Toast.makeText(_activity,msg,Toast.LENGTH_SHORT).show();
    }

    public void st_debug(String msg){
        Log.i(TAG,msg);
    }
}

由于这里引入了UnityPlayer.currentActivity,所以我们需要引入unity的jar。

安装目录EditorDataPlaybackEnginesAndroidPlayerVariationsmonoReleaseClassesclasses.jar

安装目录EditorDataPlaybackEnginesAndroidPlayerSourcecomunity3dplayerUnityPlayerActivity.java

将该文件copy到工程目录下的lib目录,并且重命名为:unity.jar

//build.gradle引入jar
compileOnly files('libs\unity.jar')

此时重新生成项目,将项目生成的aar和AndroidManifest.xml(根据实际可选)拷贝到unity工程的:Assets/Plugins/Android 目录下:

注意:如果拷贝了AndroidManifest.xml一定要修改Application的启动项为UnityPlayerActivity或者其子类,否则因缺少启动项,app启动失败




	
		
			
				
				
			
		
	



为什么说AndroidManifest.xml是可选的?因为如果不涉及权限,Activity以及用户自定义的meta数据的话,那么AndroidManifest.xml对于lib来说是空的,可以忽略,此时就可以不拷贝AndroidManifest.xml。

此时就可以在C#脚本里面调用对应的接口了。

//获取com.stdemo.stsdk.Androidapi 类
AndroidJavaClass sensorsDataAPIClass = new AndroidJavaClass("com.stdemo.stsdk.Androidapi");
//调用类的静态函数
AndroidJavaObject apiInstance = sensorsDataAPIClass.CallStatic("instance");
//调用类的成员函数
apiInstance.Call("st_debug", log);

C#脚本接口说明
获取java某个类或者类的实例

//eg:完整的类名com.stdemo.stsdk.Androidapi
AndroidJavaClass xxxClass = new AndroidJavaClass("完整的类名");

//获取某个类的实例对象
AndroidJavaObject xxxObj= new AndroidJavaObject("完整的类名");

调用某个类的静态函数

xxxClass.CallStatic<返回值类型>("函数名",agr0,arg1,....argN)

调用某个类的成员函数

//在获取了某个类的实例的情况下
xxClassInstance.Call<返回值类型>("函数名",agr0,arg1,....argN)
可能遇见的坑:
1.生成的apk无法运行?
方案一:AndroidManifest.xml文件配置不对,检查是否存启动项
方案二:如果使用Unity Build and Run安装的,那么请导出工程,使用Android studio 编译运行工程。

2.unity3d android导出项目编译Multiple dex files define Lcom/unity3d/player/UnityPlayerActivity 
解决方案:将lib的包名com.unity3d.player修改为:com.unity3d.players,右键->Refactor->Rename
参考博客:https://blog.csdn.net/weixin_30898109/article/details/95009467


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/821004.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号