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.mzph.cn/diannao/16736.shtml

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

相关文章

@Async详解,为什么生产环境不推荐直接使用@Async?

一、Async 注解介绍&#xff1a; Async 注解用于声明一个方法是异步的。当在方法上加上这个注解时&#xff0c;Spring 将会在一个新的线程中执行该方法&#xff0c;而不会阻塞原始线程。这对于需要进行一些异步操作的场景非常有用&#xff0c;比如在后台执行一些耗时的任务而不…

JUC框架(Semaphore、CountDownLatch、CyclicBarrier)

文章目录 Semaphore(信号量)Semaphore介绍Semaphore基本概念Semaphore使用场景Semaphore示例 CountDownLatch &#xff08;计数器/闭锁&#xff09;CountDownLatch 介绍CountDownLatch 基本概念CountDownLatch 使用场景CountDownLatch 基本方法CountDownLatch 示例 CyclicBarri…

分布式微服务之springboot学习

跟着韩顺平老师学Java SpringBoot基本介绍官方文档springboot是什么?springboot快速入门需求/图解说明完成步骤快速入门小结 Spring SpringMVC SpringBoot的关系梳理关系如何理解 -约定优于配置 依赖管理和自动配置依赖管理什么是依赖管理修改自动仲裁/默认版本号 starter场景…

mac 安装java jjdk8 jdk11 jdk17 等

oracle官网 https://www.oracle.com/java/technologies/downloads/ 查看当前电脑是英特尔的x86 还是arm uname -m 选择指定版本&#xff0c;指定平台的安装包&#xff1a; JDK8 JDK11的&#xff0c;需要当前页面往下拉&#xff1a; 下载到的安装包&#xff0c;双击安装&#x…

ChatGLM3-6B部署

ZhipuAI/chatglm3-6b 模型文件地址 ChatGLM3 代码仓库 ChatGLM3 技术文档 硬件环境 最低要求&#xff1a; 为了能够流畅运行 Int4 版本的 ChatGLM3-6B&#xff0c;最低的配置要求&#xff1a; 内存&#xff1a;> 8GB 显存: > 5GB&#xff08;1060 6GB,2060 6G…

[力扣]——231.2的幂

题目描述&#xff1a; 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 bool isPowerOfTwo(int n){ if(n0)retur…

3D技术的应用领域

3D技术在现代科技和工业中有广泛的应用&#xff0c;其涵盖的领域非常广泛&#xff0c;从娱乐到医学&#xff0c;再到制造业和建筑&#xff0c;3D技术正在改变我们理解和互动的方式。以下是一些主要的应用领域。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&…

如何获取某个城市或区域的人口分布数据?

人口分布数据在多个领域都扮演着至关重要的角色。这些数据不仅反映了一个国家或地区的人口分布状况&#xff0c;而且为政策制定者、企业决策者和研究者提供了宝贵的信息。那么&#xff0c;我们如何获取这些重要的人口分布数据呢&#xff1f; 政府统计部门是最主要的来源。各国政…

通用代码生成器应用场景二,快速原型

通用代码生成器应用场景二&#xff0c;快速原型 对项目经理&#xff0c;产品经理和售前工程师而言&#xff0c;开发快速原型是一种常见的需求。使用通用代码生成器&#xff0c;您可以更好&#xff0c;更快的开发系统的快速原型。通用代码生成器对完成CRUD和登录系统阶段的快速…

2024 NahamConCTF re 部分wp

IPromise 附件拖入ida main里没东西&#xff0c;但是函数列表很明显。直接在线网站解 Taylors First Swift 附件拖入ida&#xff0c;会提示识别到结构&#xff0c;选择yes 比较简单&#xff0c;可以直接猜异或之后再base64 Whats in the Box? 新遇见的题型&#xff0c;是用mak…

四元数学习总结(2)

导语&#xff1a;相比矩阵&#xff0c;用四元数处理3D旋转的优势是毋庸置疑的&#xff0c;但由于概念复杂&#xff0c;难于理解&#xff0c;一直令我摸不着头脑。最近学习更是发现在机器人、无人机、SLAM等先进领域&#xff0c;四元数被当成实数、整数这样的基础&#xff0c;所…

抄单 高频下单系统的功能都有什么?

1、多开&#xff1a;同一台电脑同一个账户无限数量登录&#xff08;登录后可独立新开合约&#xff0c;挂单&#xff0c;买卖等&#xff09;&#xff0c;多开后可使用三种不同切换方式来回切换&#xff0c;第一种为ALTTab切换、第二种为点击搜索条切换、第三种为点击下方任务栏切…

RT-Thread更改msh串口波特率

修改rt-thread文件下components下dirvers下serial.h文件里 #define RT_SERIAL_CONFIG_DEFAULT 里的默认波特率即可

Vue进阶之Vue项目实战(三)

Vue项目实战 图表渲染安装echarts图表渲染器(图表组件)图表举例&#xff1a;创建 ChartsRenderer.vue创建 ChartsDataTransformer.ts 基于 zrender 开发可视化物料安装 zrender画一个矩形画一个柱状图 基于svg开发可视化物料svg小示例使用d3进行图表渲染安装d3基本使用地图绘制…

柏拉图表征假说:AI模型趋同于现实的统一表征

引言 近日&#xff0c;Ilya Sutskever在离开OpenAI后不久点赞了一篇由MIT团队发表的AI论文&#xff0c;这篇题为《The Platonic Representation Hypothesis》的论文引起了广泛关注。这篇论文探讨了AI模型在不同数据和模态上的训练是否趋向于收敛成一个共享的现实世界统计模型。…

怎么识别图片中的文字呢!??

要识别图片中的文字&#xff0c;一般使用OCR软件来实现这一需求&#xff0c;下面以金某识别网页版为例&#xff0c;说说操作步骤&#xff1a; 一、点击“点击添加需转换的图片或PDF”&#xff0c;如还没登录将弹出登录窗口&#xff0c;直接登录即可&#xff0c;如已登录&#x…

基于 Wireshark 分析 UDP 协议

一、UDP 协议 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种无连接的传输层协议&#xff0c;常用于传输即时数据&#xff0c;如音频、视频和实时游戏数据等。 UDP 的特点如下&#xff1a; 1. 无连接性&#xff1a;UDP 不需要在发送数…

计算机毕业设计 | SSM汽车租赁系统(附源码)

1&#xff0c; 概述 1.1 课题背景 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。用户生活水平的不断提高&#xff0c;日常生活中用户对汽车租赁系统方面的要求也在不断提高&#xff0c;需要汽车租赁系统查询的人数更是不断增加&#xff0c;使得汽车租赁系统的…

6-3 求二叉树的深度

作者 DS课程组 单位 临沂大学 本题要求实现一个函数&#xff0c;可返回二叉树的深度。 函数接口定义&#xff1a; int Depth(BiTree T);T是二叉树树根指针&#xff0c;函数Depth返回二叉树的深度&#xff0c;若树为空&#xff0c;返回0。 裁判测试程序样例&#xff1a; #in…

电商API接口:供应商价格与主流电商平台价格做比价

品牌在进行采购工作时&#xff0c;将供应商提供的价格与主流电商平台上的公开价格进行比价是一种非常常见的做法&#xff0c;这样做的目的主要是为了保证自身供应商提供的价格具有竞争力和合理性&#xff0c;从而更好地优化采购工作。 以下是过程中的具体步骤及一些注意事项&a…