因之前一直在开发项目,断断续续写了一点博客,最后统一写了一下博客记录学习内容。

可以看到我的工作一直在进行。

目录

一、识别内容语音读取

二、点击齿轮按钮弹出使用说明界面

开发步骤

1. 创建齿轮按钮 UI

2. 创建使用说明面板 UI

3. 编写控制脚本

4. Inspector 中绑定组件

5. 使用说明示例内容


一、识别内容语音读取

通过手机摄像头识别一个现实世界中的物体,如显示器、鼠标等:

  1. 利用百度图像识别 API 识别出中文名称;

  2. 使用百度翻译 API 翻译成英文;

  3. 使用 Android 系统自带 TTS 播放英文读音;

  4. 在 UI 上显示识别结果,并 10 秒后自动清除。

技术用途
Unity 2022.3主引擎
Vuforia EngineAR识别、摄像头控制
百度 AI 平台图像识别 + 翻译
安卓 TTS英文读音播放
TextMeshPro结果显示 UI
Newtonsoft.JsonJSON 解析

修改之前的脚本

1.ARRecognitionController.cs

using UnityEngine;
using System.Collections;
using TMPro;
using Newtonsoft.Json.Linq;
using System.IO;public class ARRecognitionController : MonoBehaviour
{public CameraCapture cameraCapture;public BaiduAuth auth;public BaiduObjectRecognition recognition;public BaiduTranslate translator;public TextMeshProUGUI resultText;public TTSController ttsController;public void StartRecognition(){StartCoroutine(auth.GetAccessToken(() =>{StartCoroutine(DelayedRecognition());}));}IEnumerator DelayedRecognition(){yield return new WaitForSeconds(0.3f);StartCoroutine(StartRecognitionFlow());}IEnumerator StartRecognitionFlow(){resultText.text = "识别中...";Texture2D img = cameraCapture.CaptureImage();if (img == null){Debug.LogWarning("截图失败!");resultText.text = "无法捕获图像";yield break;}byte[] imageData = img.EncodeToJPG();string imageBase64 = System.Convert.ToBase64String(imageData);Debug.Log("上传图像Base64长度: " + imageBase64.Length);string savePath = Path.Combine(Application.persistentDataPath, "captured.jpg");File.WriteAllBytes(savePath, imageData);Debug.Log("截图已保存到: " + savePath);yield return recognition.RecognizeObject(img, json =>{Debug.Log("百度物体识别返回: " + json);var result = JObject.Parse(json);if (result["result"] != null && result["result"].HasValues){string chineseName = result["result"][0]["keyword"].ToString();Debug.Log($"识别结果: {chineseName}");StartCoroutine(translator.Translate(chineseName, translationJson =>{Debug.Log("百度翻译返回: " + translationJson);var transResult = JObject.Parse(translationJson);string english = transResult["trans_result"][0]["dst"].ToString();Debug.Log($"翻译结果: {english}");resultText.text = $"{english}\n{chineseName}";ttsController.Speak(english); // 播放英文语音StartCoroutine(ClearResultTextAfterDelay(10f)); //  显示 10 秒后清空}));}else{Debug.LogWarning("未识别出任何物体!");resultText.text = "未识别出物体";StartCoroutine(ClearResultTextAfterDelay(10f));}});}// 自动清除文本协程IEnumerator ClearResultTextAfterDelay(float delay){yield return new WaitForSeconds(delay);resultText.text = "";}
}

注意:TTSController 是挂在另一个空物体上的脚本,需要通过 public TTSController ttsController; 引用并在 Inspector 拖入。

2.TTSController.cs

using UnityEngine;public class TTSController : MonoBehaviour
{AndroidJavaObject ttsObject;void Start(){
#if UNITY_ANDROID && !UNITY_EDITORAndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");AndroidJavaClass ttsClass = new AndroidJavaClass("android.speech.tts.TextToSpeech");ttsObject = new AndroidJavaObject("android.speech.tts.TextToSpeech", context, new TTSListener());
#endif}public void Speak(string message){
#if UNITY_ANDROID && !UNITY_EDITORif (ttsObject != null){ttsObject.Call<int>("speak", message, 0, null, null);}
#endif}// 内部监听器类(可为空)class TTSListener : AndroidJavaProxy{public TTSListener() : base("android.speech.tts.TextToSpeech$OnInitListener") { }public void onInit(int status){Debug.Log("TTS 初始化状态:" + status);}}
}

注意:Unity 编辑器中无法播放,需真机测试。

二、点击齿轮按钮弹出使用说明界面

实现:点击右上角齿轮图标,弹出一块“使用说明”界面,并且可以关闭。引导用户进行操作。

实现以下逻辑:

  • 场景右上角有一个齿轮图标(代表“设置”)

  • 用户点击齿轮后,弹出一个使用说明的 UI 面板

  • 面板中包含简单的说明文字与一个关闭按钮

  • 点击关闭按钮后,面板隐藏

开发步骤

1. 创建齿轮按钮 UI

在 Canvas 下创建一个按钮(UI → Button):

  • 将其命名为 GearButton

  • 替换默认按钮图片为一个齿轮图标(建议 PNG 格式透明背景)

  • 设置位置为右上角(可以使用 Anchor Preset 设置为 Top-Right)

2. 创建使用说明面板 UI

在 Canvas 下再创建一个 Panel,命名为 InstructionsPanel

  • 设置背景颜色为半透明灰色

  • 添加一个 TextMeshPro 用于显示使用说明内容

  • 添加一个关闭按钮 CloseButton,可以是 “X” 图标(找一个图标即可)

注意:在 Hierarchy 中选中 InstructionsPanel取消勾选勾选框,让它在启动时默认隐藏(等同于 SetActive(false))。

3. 编写控制脚本

新建脚本 GearSettingsUI.cs,实现点击按钮的显示/隐藏逻辑:

using UnityEngine;
using UnityEngine.UI;public class GearSettingsUI : MonoBehaviour
{public GameObject instructionsPanel;public Button gearButton;public Button closeButton;void Start(){instructionsPanel.SetActive(false); // 初始隐藏gearButton.onClick.AddListener(ShowInstructions);closeButton.onClick.AddListener(HideInstructions);}void ShowInstructions(){instructionsPanel.SetActive(true);}void HideInstructions(){instructionsPanel.SetActive(false);}
}

4. Inspector 中绑定组件

把对应的 UI 拖入:

  • gearButton → 齿轮按钮

  • instructionsPanel → 说明面板

  • closeButton → 面板里的关闭按钮

5. 使用说明示例内容

BodyText中写入我的内容:

- 拖动模型旋转视角
- 捏合手势放大缩小
- 点击物体查看详情
- 点击“返回”退出体验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87631.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87631.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/87631.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unable to start embedded Tomcat

通常是由于xml文件配置错误导致 1. mapper 指向错误 <resultMap id"Waybill" type"c.Waybill"> 2. 字段类型错误 <result column"wstatus" property"stus" javaType"TINYINT"/>TINYINT 是数据库类型<resu…

Mac电脑 充电限制保护工具 AlDente Pro

AlDente Pro一款充电限制保护工具&#xff0c;是可以限制最大充电百分比来保护电池的工具。 锂离子和聚合物电池&#xff08;如 MacBook 中的电池&#xff09;在40&#xff05; 至 80&#xff05; 之间运行时&#xff0c;使用寿命最长。 始终将电池电量保持在 100&#xff05…

KungfuBot——基于物理约束和自适应运动追踪的人形全身控制PBHC,用于学习打拳或跳舞(即RL下的动作模仿和运控)

前言 昨天618&#xff0c;我司「七月在线」同事朝阳为主力&#xff0c;我打杂&#xff0c;折腾了整整一天&#xff0c;终于可以通过VR摇操宇树G1了——当然&#xff0c;摇操是为了做训练数据的采集&#xff0c;从而方便 下一步的模型(策略)训练&#xff0c;最终实现机器人自主…

Kafka多副本机制

副本和副本因子 Kafka 会为每个 Partition 创建多个副本。这些副本分布在不同的 Broker 上。副本确保了数据的冗余存储&#xff0c;即使某个 Broker 宕机或失效&#xff0c;其他副本可以继续提供服务。 副本因子指的是每个 Partition 有多少个副本。副本因子的设置决定了一个…

Vue3类似百度风格搜索框组件

Vue3百度风格搜索框组件&#xff0c;使用vue3进行设计&#xff0c;亦有vue3TS的版本。 vue3组件如下&#xff1a; <template><!-- 搜索组件容器 --><div class"search-container"><!-- 百度Logo - 新样式 --><div class"logo-conta…

智净未来:华为智选IAM以科技巧思优化家庭健康饮水体验

在中国家庭中&#xff0c;净水器早已成为厨房标配&#xff0c;但传统净水设备的使用体验却远未达到理想状态。根据《2023年中国家庭净水器使用调研报告》显示&#xff0c;超过65%的用户对传统净水器存在不满&#xff0c;主要痛点集中在功能单一、操作复杂、维护麻烦、噪音大、废…

细说STM32单片机SPI-Flash芯片的FatFS移植

目录 一、SPI-Flash芯片硬件电路 二、CubeMX项目基础设置 1、RCC、SYS、Code Generator、USART6、NVIC 2、RTC 3、SPI2 4、GPIO 5、FatFS模式 6、FatFS参数设置概述 &#xff08;1&#xff09;Version组 &#xff08;2&#xff09;Function Parameters组 1&#x…

ubuntu 22.04 安装部署logstash 7.10.0详细教程

安装部署logstash 7.10.0详细教程 一、下载并安装二、新建配置文件三、赋权文件权限四、检测文件grok语法是否异常五、启动服务六、安装启动常见问题 【背景】 整个elk安装是基于ubuntu 22.04和jdk 11环境。logstash采用 *.deb方式安装&#xff0c;需要服务器能联网。ubuntu 22…

JVM对象创建与内存分配机制深度剖析

对象创建的主要流程 类加载检查 在创建对象之前&#xff0c;JVM 首先会检查该类是否已经加载、解析并初始化&#xff1a; 如果没有&#xff0c;则会通过类加载机制加载类元信息&#xff08;Class Metadata&#xff09;到方法区。 这个过程包括&#xff1a;加载&#xff08;load…

Navicat 技术指引 | TiDB 的 AI 查询交互功能

目前&#xff0c;Navicat 两款工具支持对 TiDB 数据库的管理开发功能&#xff1a;一款是旗舰款 Navicat Premium&#xff0c;另一款是其轻量化功能的 Navicat Premium Lite&#xff08;官方轻量级免费版&#xff09;。Navicat 自版本 17.1 开始支持 TiDB 7。它支持的系统有 Win…

以list为输入条件,查询数据库表,java中的mapper层和mybatis层应该怎么写?

根据一个 List 中的两个字段 rangeCode 和 unitcd&#xff0c;查询数据库表 model_engineering_spatial_unit。这个需求在 Java MyBatis 项目中非常常见&#xff0c;下面我将为你详细写出 Mapper 接口&#xff08;Java&#xff09; 和 MyBatis XML 映射文件 的写法。 ✅ 前提…

pyspark 创建DataFrame

from pyspark.sql import SparkSession from pyspark.sql import StructType, StructField, IntegerType,StringType spark SparkSession.builder.appName(test).getOrCreate() 1、 从列表中创建DataFrame data [(1,"alice"),(2,Blob),(3,Charlie)] columns [&qu…

Vim:从入门到进阶的高效文本编辑器之旅

目录 一、Vim简介 二、Vim的基础操作 2.1 进入和退出Vim 2.2 Vim的三种模式 2.3 基础移动 三、Vim的高效编辑技巧 3.1 文本编辑 3.2 文本删除与修改 3.3 复制与粘贴 四、Vim的进阶使用 4.1 搜索与替换 4.2 寄存器与宏 4.3 插件与配置 五、结语 在编程界&#xff0…

Docker基础理论与阿里云Linux服务器安装指南

文章目录 一、Docker核心概念二、阿里云环境准备三、Docker安装与配置四、核心容器部署示例五、开发环境容器化六、运维管理技巧七、安全加固措施 一、Docker核心概念 容器化本质&#xff1a; 轻量级虚拟化技术&#xff0c;共享主机内核进程级隔离&#xff08;cgroups/namespac…

c#使用笔记之try catch和throw

一、try catch 一种报错的捕捉机制&#xff0c;try块里运行的代码出现错误的时候就会去执行catch块所以一般catch块里都是把错误打印出来或者保存到log日志里&#xff1b; 1.1、具体使用 catch可以用&#xff08;&#xff09;来选择捕捉什么类型的错误&#xff0c;一般用Exc…

(新手友好)MySQL学习笔记(9):索引(常见索引类型,查找结构的发展(二分查找法,二叉搜索树,平衡二叉树,B树,B+树))

目录 索引 常见索引类型 B树 二分查找法 二叉搜索树和平衡二叉树 B树和B树 索引 index&#xff0c;是存储引擎用于快速找到数据的一种数据结构。 MySQL默认使用InnoDB存储引擎&#xff0c;该存储引擎是最重要&#xff0c;使用最广泛的&#xff0c;除非有非常特别的原因需要使用…

进程间通信1(匿名管道)Linux

1 进程间通信的必要性 首先要明确进程间是相互独立的&#xff08;独享一份虚拟地址空间&#xff0c;页表&#xff0c;资源&#xff09;&#xff0c;那怎么样才能使得两个进程间实现资源的发送&#xff1f;所以&#xff0c;两个进程一定需要看到同一份资源&#xff0c;并且⼀个…

CAN2.0、DoIP、CAN-FD汽车协议详解与应用

一、CAN2.0 协议详解与应用示例 1. 技术原理与特性 协议架构&#xff1a;基于 ISO 11898 标准&#xff0c;采用载波监听多路访问 / 冲突检测&#xff08;CSMA/CD&#xff09;机制&#xff0c;支持 11 位&#xff08;CAN2.0A&#xff09;或 29 位&#xff08;CAN2.0B&#xff…

使用nvm管理npm和pnpm

1.使用nvm管理npm // 查看nvm版本 nvm -v // 查看可安装的 node 版本 nvm ls-remote // 安装指定 node 版本 nvm install 24.0.0 // 查看当前已安装的 node 版本及当前使用的版本 nvm list // 使用某个版本 node nvm use 24.0.0 // 卸载指定 node 版本 nvm uninstall 16.20.1…

YOLO11+QT6+Opencv+C++训练加载模型全过程讲解

实现效果&#xff1a; Yolov11环境搭建&#xff08;搭建好的可以直接跳过&#xff09; 最好使用Anconda进行包管理&#xff0c;安装可参考【文章】。下面简单过一下如何快速部署环境。如果搭建过或可以参考其他文章可以跳过Yolo11环境搭建这一章节。总体来说Yolov11环境搭建越…