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的输入事件和用法。

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

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

相关文章

一个月速刷leetcodeHOT100 day13 二叉树结构 以及相关简单题

树是一种分层数据的抽象模型 二叉树 二叉树中的节点最多只能有两个子节点&#xff0c;一个是左侧子节点&#xff0c;另一个是右侧子节点 二叉搜索树 二叉搜索树&#xff08;BST&#xff09;是二叉树的一种&#xff0c;但是只允许你在左侧节点存储&#xff08;比父节点&…

BPTT算法详解:深入探究循环神经网络(RNN)中的梯度计算【原理理解】

引言 在深度学习领域中&#xff0c;我们经常处理的是独立同分布&#xff08;i.i.d&#xff09;的数据&#xff0c;比如图像分类、文本生成等任务&#xff0c;其中每个样本之间相互独立。然而&#xff0c;在现实生活中&#xff0c;许多数据具有时序结构&#xff0c;例如语言模型…

【BUG】Edge|联想电脑 Bing 搜索报错“Ref A: 乱码、 Ref B:乱码、Ref C: 日期” 的解决办法

文章目录 省流版前言解决办法 详细解释版前言问题描述与排查过程解决办法与总结 省流版 我原以为我解决了&#xff0c;才发的博客&#xff0c;晚上用了一下其他设备发现还是会出现这个问题… 这篇博客并未解决该问题&#xff0c;如果评论里有人解决了这个问题不胜感激&#x…

Linux_应用篇(08) 信号-基础

本章将讨论信号&#xff0c;虽然信号的基本概念比较简单&#xff0c;但是其所涉及到的细节内容比较多&#xff0c;所以本章篇幅也会相对比较长。 事实上&#xff0c;在很多应用程序当中&#xff0c;都会存在处理异步事件这种需求&#xff0c;而信号提供了一种处理异步事件的方法…

6.S081的Lab学习——Lab5: xv6 lazy page allocation

文章目录 前言一、Eliminate allocation from sbrk() (easy)解析&#xff1a; 二、Lazy allocation (moderate)解析&#xff1a; 三、Lazytests and Usertests (moderate)解析&#xff1a; 总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。打算尝试6.S081&#xff0…

Facebook开户 | 如何检查公共主页的状态

想要了解你的Facebook公共主页的状态吗&#xff1f; Facebook公共主页是让广告主与粉丝互动、传播信息的绝佳平台&#xff0c;但是大家知道如何检查并维护自己的主页状态吗&#xff1f;别担心&#xff0c;Facebook提供了一系列简单易用的工具来帮助大家实现这一目标。 *Page Q…

自定义数据集上的3D目标检测:使用OpenPCDet训练CenterPointPillar模型

前言 在自动驾驶和机器人领域&#xff0c;3D目标检测是关键技术之一。它能够提供关于周围环境中物体的精确位置和尺寸信息。OpenPCDet是一个基于PyTorch的开源3D目标检测框架&#xff0c;支持多种3D检测网络。在本文中&#xff0c;我们将探讨如何使用OpenPCDet框架和CenterPoi…

每天学点小知识:Windows终端Powershell美化

前言 本章的旨在教会你美化自己的终端&#xff0c;powershell需要以管理员运行 经过我的测试&#xff0c;不同的电脑可能会有不同的报错&#xff0c;具体操作根据官方为主https://ohmyposh.dev/docs 效果展示 Oh My Posh&#xff1a;提供美观的 PowerShell 提示符主题 1.安装…

第16章-超声波跟随功能 基于STM32的三路超声波自动跟随小车 毕业设计 课程设计

第16章-超声波跟随功能 无PID跟随功能 //超声波跟随if(HC_SR04_Read() > 25){motorForward();//前进HAL_Delay(100);}if(HC_SR04_Read() < 20){motorBackward();//后退HAL_Delay(100);}PID跟随功能 在pid.c中定义一组PID参数 tPid pidFollow; //定距离跟随PIDpidFol…

酷黑简洁大气体育直播自适应模板赛事直播门户网站源码

源码名称&#xff1a;酷黑简洁大气体育直播自适应模板赛事直播门户网站源码 开发环境&#xff1a;帝国cms 7.5 安装环境&#xff1a;phpmysql 支持PC与手机端同步生成html&#xff08;多端同步生成插件&#xff09; 带软件采集&#xff0c;可以挂着自动采集发布&#xff0c;无…

用Python实现办公自动化

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

matlab工具使用记录-编辑器和命令行窗口分开还原

工具&#xff1a;matlab2021b 场景&#xff1a;在使用软件的过程中&#xff0c;我们误操作将matlab的编辑器单独出来了。这时候对软件进行各种操作都还原不回去。 matlab中编辑器和命令行窗口分开了如下图所示。 这时候只需要使用快捷键在编辑器窗口按CtrlshiftD&#xff0c;…

Visual Studio 的调试

目录 引言 一、调试的基本功能 设置断点 启动调试 检查变量 逐步执行代码 调用堆栈 使用即时窗口 二、调试技巧 条件断点 日志断点 数据断点 异常调试 三、调试高级功能 远程调试 多线程调试 内存调试 性能调试 诊断工具 四、调试策略与最佳实践 系统化的…

揭秘python模块导入的“隐身术”:如何控制模块代码的执行?

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;两个下划线的奥秘 二、案例展示&#xff1a;模块导入与代码执行 1. 导…

leetcode124 二叉树中的最大路径和-dp

题目 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &…

el-upload上传文件使用http-request方法,formdata传集合List到后台

el-upload上传文件 前言1、使用el-upload上传文件1.1代码演示1.2回显列表2、formdata传集合List到Springboot后台前言 在使用el-upload上传文件,会遇到必须使用:action="upload_url"远端链接的问题,本章我们讲解怎样不适用远端链接,通过上传获取到本地的file文件…

AI重塑保险业未来:机器学习在风险评估、欺诈检测与客户服务中的深度应用

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

技术架构设计指南:从需求到实现

技术架构是软件系统的骨架&#xff0c;它决定了系统的性能、可靠性、扩展性等关键特性。本文将介绍技术架构设计的一般步骤和方法。 第一步&#xff1a;需求分析 在设计技术架构之前&#xff0c;首先要对系统需求进行全面深入的分析。这包括功能需求、非功能需求&#xff08;如…

【渗透测试】|文件上传

1、安装使用蚁剑 https://blog.csdn.net/weixin_42474304/article/details/116376746 1、登陆dvwa,进入初级文件上传&#xff0c;上传一句话木马文件cmd.php&#xff0c; //cmd.php <?php eval($_POST[ccit]); ?> //eval: 执行命令的函数 //ccit:一句话木马文件的参数…

一个生动的例子——通过ERC20接口访问Tether合约

生动的例子 USDT&#xff1a;符合ERC20标准的美元稳定币&#xff0c;Tether合约获得测试网上Tether合约地址通过自己写的ERC20接口访问这个合约 Tether合约地址&#xff1a;0xdAC17F958D2ee523a2206206994597C13D831ec7 IERC20.sol // SPDX-License-Identifier: GPL-3.0pra…