当前位置: 首页 > news >正文

Unity3D输入事件

文章目录

  • 前言
  • 一、全局事件
  • 二、射线
  • 三、点选3D模型
  • 四、点击地面控制人物移动
  • 总结


前言

Unity输入事件分为两类,全局触发和监听式触发。全局触发通常是运行在update在每帧进行检测,而监听式触发是被动的输入事件。


一、全局事件

在最新的unity中有新和旧两种输入系统,此处只讲旧输入系统。新输入系统更类似与插件的形式绑定在unity中,对多种设备的适配更加友好,主机手柄、PC等操作可以一步到位,如有需要会单独讲解。

using UnityEngine;public class InputTestScript : MonoBehaviour
{void Update(){//按下空格键if(Input.GetKeyDown(KeyCode.Space)) {}//抬起空格键if(Input.GetKeyUp(KeyCode.Space)) {}//按下空格键(持续触发)if(Input.GetKey(KeyCode.Space)) {}//按下鼠标左键,手机上则是按下屏幕if(Input.GetMouseButton(0)) {Debug.LogFormat("点击屏幕坐标:{0}", Input.mousePosition);}//手指触摸屏幕中if(Input.touchCount > 0) {Touch touch = Input.GetTouch(0);//开始触摸if(touch.phase == TouchPhase.Began) {}//触摸移动if(touch.phase == TouchPhase.Moved) {}//触摸结束if(touch.phase == TouchPhase.Ended) {}//是否支持3D Touchif(Input.touchPressureSupported) {Debug.LogFormat("3DTouch的力度:{0}", touch.pressure);}}}
}

写法和用法都十分简单。如果需要监听多个触点(例如多指操控),可以使用一些插件快速实现。对于触摸屏多点触控的专业解决方案,建议使用 TUIO协议。

二、射线

在 Unity 中,射线(Raycasting)是一种用于检测从某一点沿某一方向发射的一条“射线”与场景中的物体相交的技术。射线检测在游戏开发中广泛应用,例如点击检测、视线检测、物理碰撞、AI 视野等。Unity 提供了多种射线检测方法,通过 Physics 类来使用。

using UnityEngine;using UnityEngine;public class Script_13_17 : MonoBehaviour
{void Update(){// 检查鼠标左键是否被按下if (Input.GetMouseButtonDown(0)) {// 从鼠标点击位置生成一条射线Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;// 执行射线检测,检测第一个碰到的对象if (Physics.Raycast(ray, out hit)) {Debug.LogFormat("Raycast: {0} 3D坐标:{1}", hit.collider.name, hit.point);}// 执行射线检测,检测所有碰到的对象RaycastHit[] hits = Physics.RaycastAll(ray);foreach (var h in hits) {Debug.LogFormat("RaycastAll: {0} 3D坐标:{1}", h.collider.name, h.point);}}}
}

unity还提供了一个层级忽略射线,该层级默认不接受射线碰撞。
在这里插入图片描述

三、点选3D模型

点选模型可以使用射线,也可以使用unity封装的Event system,她可以处理UI和3D对象的点击,如果UI挡在3D模型上,会优先相应UI。
1、给相机添加Physics Raycaster组件。
在这里插入图片描述
创建Click3D脚本挂在点选的物体上。

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;// 用于表示 3D 点击事件的 UnityEvent
public class Click3DEvent : UnityEvent<GameObject, PointerEventData> { }public class Click3D : MonoBehaviour, IPointerClickHandler
{// 静态事件,用于派发 3D 点击事件public static Click3DEvent click3DEvent = new Click3DEvent();// 实现 IPointerClickHandler 接口的方法,当对象被点击时调用public void OnPointerClick(PointerEventData eventData){// 触发 3D 点击事件,将当前游戏对象和 PointerEventData 作为参数传递click3DEvent.Invoke(gameObject, eventData);}}

再创建一个脚本统一监听事件。

using UnityEngine;
using UnityEngine.EventSystems;public class Click3DEventListener : MonoBehaviour
{void Start(){// 监听 3D 点击事件,当发生点击时执行回调函数Click3D.click3DEvent.AddListener(delegate (GameObject gameObject, PointerEventData arg1) {Debug.LogFormat("点选3D模型: {0}", gameObject.name);});}
}

如果没有效果请创建一个UI,事件需要UI附带的EventSystem的支持。

四、点击地面控制人物移动

通过鼠标知道移动的地点,再使用Vector3.MoveTowards根据步长就能够轻松移动模型,在很多项目的demo阶段或者测试中都很实用。

using UnityEngine;public class Script_13_19 : MonoBehaviour
{// 模型public Transform model;// 3DTextMeshpublic TextMesh textMesh;// 移动目的地private Vector3 m_MoveToPosition = Vector3.zero;void Update(){// 检查鼠标左键是否被按下if (Input.GetMouseButtonDown(0)){// 从鼠标点击位置生成一条射线Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;// 执行射线检测,检测第一个碰到的对象if (Physics.Raycast(ray, out hit)){// 面朝选择点m_MoveToPosition = new Vector3(hit.point.x, model.position.y, hit.point.z);model.LookAt(m_MoveToPosition);// 显示点击位置信息textMesh.text = string.Format("点击位置{0}", hit.point);textMesh.transform.position = hit.point;}}// 如果模型未达到目的地,则移动模型if (model.position != m_MoveToPosition){// 步长float step = 5f * Time.deltaTime;model.position = Vector3.MoveTowards(model.position, m_MoveToPosition, step);}}
}

总结

简单的说了下Unity的输入事件和用法。

相关文章:

Unity3D输入事件

文章目录 前言一、全局事件二、射线三、点选3D模型四、点击地面控制人物移动总结 前言 Unity输入事件分为两类&#xff0c;全局触发和监听式触发。全局触发通常是运行在update在每帧进行检测&#xff0c;而监听式触发是被动的输入事件。 一、全局事件 在最新的unity中有新和旧…...

c++ thread detach

#include <thread> #include <iostream>using namespace std;void func() {cout << "子线程func开始执行&#xff01;" << endl;//do somethingcout << "子线程func执行结束&#xff01;" << endl; }int main() {cout…...

入门四认识HTML

目录 一、HTML介绍 1、Web前端三大核心技术 2、什么是HTML 3、Html标签 4、标签属性 二、HTML骨架标签 三、编写HTML工具 四、常用标签 1、注释 2、标题标签 3、段落标签 4、超链接标签 5、图片标签 6、换行与空格 7、布局标签 8、列表标签 9、表单…...

js怎么生成验证码?js生成指定长度的随机字符串

在项目中经常有生成随机字符串的需求&#xff0c;比如验证接口签名、验证码(Node.js发送短信或邮箱验证码、生成图片验证码)&#xff0c;我们可以使用Javascript生成随机字符。 使用随机数从给出的可能字符中抽取合并字符串 优点是可以自定义结果中字符的取值&#xff0c;比如…...

Python魔法之旅-魔法方法(01)

目录 一、概述 1、定义 2、作用 二、主要应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类…...

介绍下 npm 模块安装机制,为什么输入 npm install 就可以自动安装对应的模块

npm&#xff08;Node Package Manager&#xff09;模块安装机制是Node.js生态系统中非常重要的一部分&#xff0c;它允许开发者轻松管理和安装Node.js项目的依赖项。下面我将详细介绍npm模块的安装机制&#xff0c;以及为什么输入npm install就可以自动安装对应的模块。 npm模…...

vue2如何父组件 对象 双向绑定子组件

对于Vue 2&#xff0c;你不能直接用v-model绑定对象&#xff0c;但可以通过在子组件内部处理value prop的变化并触发input事件来模拟这一行为。 父组件A 1<template> 2 <ComponentB v-model"item" prop-names"addressId,date,startTime,endTime&quo…...

[Android]在后台线程执行耗时操作,然后在主线程更新UI

1.Coroutines&#xff08;官方推荐&#xff09; Coroutines 提供了一种轻量级的线程管理方式&#xff0c;使得在后台线程执行任务和在主线程更新 UI 变得简单。以下是如何在 Kotlin 中使用 Coroutines 来处理耗时逻辑并更新 UI 的步骤&#xff1a; 添加 Coroutines 依赖: 首…...

平方回文数-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第73讲。 平方回文数&#…...

位置编码(三) 2D旋转位置编码

Rotary Position Embedding for Vision Transformer https://arxiv.org/abs/2403.13298 Transformer升级之路&#xff1a;4、二维位置的旋转式位置编码 https://kexue.fm/archives/8397 Transformer升级之路&#xff1a;17、多模态位置编码的简单思考 https://kexue.fm/archive…...

1、pikachu靶场之xss钓鱼复现

一、复现过程 1、payload <script src"http://127.0.0.1/pkxss/xfish/fish.php"></script> 将这段代码插入到含有储存xss的网页上&#xff0c;如下留言板 2、此时恶意代码已经存入数据库&#xff0c;并存在网页中&#xff0c;当另一个用户打开这个网页…...

弘君资本炒股技巧:股票定向增发是什么意思?是好是坏?

股票定向增发是指已上市的公司向指定的组织或者个人投资者额外发行股份募集资金的融资方法&#xff0c;发行价格为发行前某一阶段的平均价的必定比例&#xff0c;增发的价格不得低于前二十个买卖日股票均价的80&#xff05;。 例如&#xff0c;个股定增前二十个买卖股票平均价为…...

vue3项目使用pinia状态管理器----通俗易懂

1、首先安装pinia yarn add pinia # 或使用npm npm install pinia 2、在项目的src目录下新建store文件夹&#xff0c;然后store目录下新建index.js / index.ts &#xff1a; 我这里是index,js import { createPinia } from "pinia"// 创建 Pinia 实例 const pinia …...

零基础学Java第二十五天之Lambda表达式

Lambda表达式 简介 Lambda是一个匿名函数(方法)&#xff0c; 允许把函数作为一个方法的参数 。利用Lambda表达式可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格&#xff0c;使Java的语言表达能力得到了提升。一般都是优化匿名内部类 基础语法 无参数、无返回值的抽…...

VSCode配置Lua5.4安装

参考&#xff1a;VSCode 配置 Lua 开发环境(清晰明了)_lua vscode-CSDN博客 1.下载 Lua Binaries Download (sourceforge.net) 2.配置环境变量 解压放到某文件夹&#xff1a; 环境变量&#xff1a; 3.VSCode安装插件 4.配置 5.测试...

CI/CD:持续集成/持续部署

1. 安装docker、docker-compose # 安装Docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i sdownload.docker.commirrors.aliyun.com/docker-ce /…...

ComfyUI工作流网站

https://openart.ai/home https://comfyworkflows.com/ https://civitai.com/...

【机器学习】机器学习基础概念与初步探索

❀机器学习 &#x1f4d2;1. 引言&#x1f4d2;2. 机器学习概述&#x1f4d2;3. 机器学习基础概念&#x1f389;2.1 机器学习的分类&#x1f389;2.2 数据预处理&#x1f308;数据清洗与整合&#x1f308; 特征选择和特征工程&#x1f308;数据标准化与归一化 &#x1f4d2;4. …...

学英语材料:单口喜剧、讲故事、短剧喜剧以及广播剧和播客节目

学习英语节目 有名的单口喜剧、讲故事、短剧喜剧以及广播剧和播客节目&#xff1a; 单口喜剧&#xff08;Stand-up Comedy&#xff09; 描述&#xff1a;这是最接近相声的形式&#xff0c;表演者独自一人站在舞台上&#xff0c;用幽默的方式讲述个人经历、观察到的社会现象或…...

Docker Compose使用

Docker-Compose是什么 docker建议我们每一个容器中只运行一个服务,因为doker容器本身占用资源极少&#xff0c;所以最好是将每个服务单独分割开来&#xff0c;但是这样我们又面临了一个问题&#xff1a; 如果我需要同时部署好多个服务&#xff0c;难道要每个服务单独写Docker…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...

【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战

🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...

【2D与3D SLAM中的扫描匹配算法全面解析】

引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件&#xff0c;它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法&#xff0c;包括数学原理、实现细节以及实际应用中的性能对比&#xff0c;特别关注…...

开疆智能Ethernet/IP转Modbus网关连接鸣志步进电机驱动器配置案例

在工业自动化控制系统中&#xff0c;常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中&#xff0c;客户现场采用了 罗克韦尔PLC&#xff0c;但需要控制的变频器仅支持 ModbusRTU 协议。为了实现PLC 对变频器的有效控制与监控&#xff0c;引入了开疆智能Etherne…...

篇章一 论坛系统——前置知识

目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构​编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...