Unity3D入门(三) : Android和Unity3D交互 - Android调用Unity

news/2024/11/17 17:41:58/

1. 前言

上篇文章,我们讲了如何在Unity3D中过渡地切换相机视角。这篇文章,我们来讲一下Unity3D怎么与Android交互

1.1 unity和Android的三种通信方式

  • Unity官方提供的接口 : 有一个弊端,它有一个传输内容量的一个限制,传输内容过大或过快的时候,会出现丢东西或崩溃的情况。
  • tcp / udp 通信: 通过socket发送和接收,通过本机地址127.0.0.1进行通讯。
  • jni : 用C++写一个中转站,生成so库,Android和Unity C#脚本分别调用这个so库。

这里我们只具体介绍一下Unity官方提供的接口,其他方式感兴趣的童鞋可以自行去了解。

2. 通过脚本切换视角

2.1 编写Camera Controller脚本

新建Camera Controller脚本,并编写如下内容

public CinemachineVirtualCamera virtualCamera1;
public CinemachineVirtualCamera virtualCamera2;void Start()
{// 默认激活第一个相机SwitchToCamera(virtualCamera1);
}void Update()
{// 按下空格键切换相机if (Input.GetKeyDown(KeyCode.Space)){if (virtualCamera1.enabled){SwitchToCamera(virtualCamera2);}else{SwitchToCamera(virtualCamera1);}}
}void SwitchToCamera(CinemachineVirtualCamera cameraToEnable)
{virtualCamera1.enabled = false;virtualCamera2.enabled = false;cameraToEnable.enabled = true;
}

2.2 应用Camera Controller

将Camera Controller拖动到Main Camera中

在这里插入图片描述

Virtual Camera1Virtual Camera2绑定到Main CameraCameraController组件中

在这里插入图片描述

这个时候,我们运行项目,通过键盘的空格健,就能够切换视角了。

通过修改Vitual Camera的priority,可以调整优先级,从而确定默认的Vitual Camera

3. Android调用Unity

3.1 Android中如何调用Unity

Unity官方已经给我们提供了接口UnityPlayer.UnitySendMessage

UnityPlayer.UnitySendMessage(var0,var1,var2);

通过这个接口,就能调用到Unity暴露的方法了。

来解释下这三个参数的意思

  • var0 : String类型,表示要接收消息的 Unity 游戏对象(GameObject)的名称。
  • var1 : String类型,表示在该游戏对象上要调用的方法的名称。
  • var2 : String类型,表示传递给该方法的参数(以字符串形式表示)。

实际上,UnityPlayer存在于unityLibrary/unity-classes.jar这个jar包中。unity通过这个jar包,使Android能够调用Unity

接下来,我们先来暴露下Unity脚本中的方法。

3.1 暴露方法

Camera Controller中,增加如下方法,暴露给Android

public void SwitchCamera1() {SwitchToCamera(virtualCamera1);
}public void SwitchCamera2()
{SwitchToCamera(virtualCamera2);
}

3.2 导出项目

点击File > Build Setting,切换到Android平台,勾选Export Project

在这里插入图片描述

然后点击Export,编译并导出项目。

导出项目成功后,可以看到在目录下,生成了Android目录结构的一个Android项目。

launcher目录就是app模块,unityLibrarymodule模块,Unity相关的代码都在unityLibrary这个模块里。

在这里插入图片描述

3.3 Android Studio导入项目

我们用Android Studio(最好用最新版本)导入这个项目。

unityLibrary/res目录下,新建layout文件夹,并在layout目录下,新建activity_unity_player.xml布局文件。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:id="@+id/layout_root"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"></FrameLayout><LinearLayoutandroid:orientation="vertical"android:layout_width="wrap_content"android:layout_height="wrap_content"><Buttonandroid:id="@+id/btn_camera1"android:text="视角1"android:layout_width="wrap_content"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/btn_camera2"android:text="视角2"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout>
</FrameLayout>

修改UnityPlayerActivity.java的onCreate方法

@Override protected void onCreate(Bundle savedInstanceState){requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);String cmdLine = updateUnityCommandLineArguments(getIntent().getStringExtra("unity"));getIntent().putExtra("unity", cmdLine);setContentView(R.layout.activity_unity_player);mUnityPlayer = new UnityPlayer(this, this);FrameLayout layoutRoot = findViewById(R.id.layout_root);layoutRoot.addView(mUnityPlayer);mUnityPlayer.requestFocus();Button btnCamera1 = findViewById(R.id.btn_camera1);Button btnCamera2 = findViewById(R.id.btn_camera2);btnCamera1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {UnityPlayer.UnitySendMessage("Main Camera","SwitchCamera1","");}});btnCamera2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {UnityPlayer.UnitySendMessage("Main Camera","SwitchCamera2","");}});}

这里UnitySendMessage调用的参数1Main Camera对应着Main Camera组件的名称。

在这里插入图片描述

参数2中的SwitchCamera1SwitchCamera2是我们刚才暴露的Unity脚本方法。

参数3由于暴露的方法没有传参,传空字符串即可。

3.4 运行Android项目

接着点击运行Android项目,可以发现,点击按钮后能够过渡地切换视角了。

在这里插入图片描述

3.5 调用带参数的方法

调用带参数的方法也是一样的

Unity脚本暴露方法

public void SwitchCameraString(string id)
{if (id.Equals("1")){SwitchToCamera(virtualCamera1);}else if (id.Equals("2")){SwitchToCamera(virtualCamera2);}else{SwitchToCamera(virtualCamera1);}
}

Android中进行调用

//切换视角1
UnityPlayer.UnitySendMessage("Main Camera","SwitchCameraString","1");
//切换视角2
UnityPlayer.UnitySendMessage("Main Camera","SwitchCameraString","2");

Unity3D_246">4. Unity3D入门系列文章

Unity3D入门(一) : 第一个Unity3D项目,实现矩形自动旋转,并导出到Android运行
Unity3D入门(二) :Unity3D过渡切换视角
Unity3D入门(三) : Android和Unity3D交互 - Android调用Unity
Unity3D入门(四) : Android和Unity3D交互 - Unity调用Android

参考
将Unity用作Android应用中的库_哔哩哔哩_bilibili
【Unity安卓】使用AndroidStudio与Unity进行简单通讯_哔哩哔哩_bilibili
Unity和Android通信_哔哩哔哩_bilibili
Unity与Android之间的通信交互_哔哩哔哩_bilibili
如何使用AndroidStudio和Untiy3D交互?_哔哩哔哩_bilibili


http://www.ppmy.cn/news/1531594.html

相关文章

C#里使用最简单的线程调用界面更新的方法

在C#的界面应用里&#xff0c;经常会遇到线程里计算得到的数据&#xff0c;要更新到界面上。 但是线程与界面线程一般不是同一个线程&#xff0c;不能直接调用更新&#xff0c;需要采用委托的方式来更新。 意思就是说&#xff0c;要线程把数据定义更新的方法之后&#xff0c;…

前端框架对比与选择概述

在快速迭代的Web开发领域,前端框架作为构建现代Web应用的基石,扮演着至关重要的角色。它们提供了丰富的组件、高效的性能优化、以及强大的生态系统,帮助开发者快速搭建高质量、可维护的Web应用。本文将对当前流行的几个前端框架进行对比分析,并给出选择框架时的一些建议。 …

leetcode621. 任务调度器

给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表&#xff0c;用字母 A 到 Z 表示&#xff0c;以及一个冷却时间 n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成&#xff0c;但有一个限制&#xff1a;两个 相同种类 的任务之间必须有长度为 n 的冷却时…

C++学习笔记(39)

307、Linux 的时间操作 UNIX 操作系统根据计算机产生的年代把 1970 年 1 月 1 日作为 UNIX 的纪元时间&#xff0c;1970 年 1 月 1 日是时间的中间点&#xff0c;将从 1970 年 1 月 1 日起经过的秒数用一个整数存放。 一、time_t 别名 time_t 用于表示时间类型&#xff0c;它是…

力扣题解2516

大家好&#xff0c;欢迎来到无限大的频道 今天继续给大家带来每日一题 题目描述&#xff08;中等&#xff09;&#xff1a; 每种字符至少取k个 给你一个由字符 ‘a’、‘b’、‘c’ 组成的字符串 s 和一个非负整数 k 。每分钟&#xff0c;你可以选择取走 s 最左侧 还是 最右…

DAY80服务攻防-中间件安全HW2023-WPS 分析WeblogicJettyJenkinsCVE

知识点 1、中间件-Jetty-CVE&信息泄漏 2、中间件-Jenkins-CVE&RCE执行 3、中间件-Weblogic-CVE&反序列化&RCE 4、应用WPS-HW2023-RCE&复现&上线CS 中间件-Jetty-CVE&信息泄漏 Jetty是一个开源的servlet容器&#xff0c;它为基于Java的Web容器…

vscode 的terminal 输出打印行数限制设置

修改 VSCODE 的 settings.json文件 "terminal.integrated.scrollback": 100000, {"extensions.ignoreRecommendations": true,"workbench.colorTheme": "Monokai","explorer.confirmDelete": false,"editor.fontSize…

自动化测试实例:Web登录功能性测试(无验证码)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是自动化测试 把人为驱动的测试行为转化为机器执行的一种过程称为自动化测试。(来自百度百科)本质上来说&#xff0c;自动化测试对比起手工测试除了需要…