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输入事件分为两类,全局触发和监听式触发。全局触发通常是运行在update在每帧进行检测,而监听式触发是被动的输入事件。 一、全局事件 在最新的unity中有新和旧…...
c++ thread detach
#include <thread> #include <iostream>using namespace std;void func() {cout << "子线程func开始执行!" << endl;//do somethingcout << "子线程func执行结束!" << 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生成指定长度的随机字符串
在项目中经常有生成随机字符串的需求,比如验证接口签名、验证码(Node.js发送短信或邮箱验证码、生成图片验证码),我们可以使用Javascript生成随机字符。 使用随机数从给出的可能字符中抽取合并字符串 优点是可以自定义结果中字符的取值,比如…...
Python魔法之旅-魔法方法(01)
目录 一、概述 1、定义 2、作用 二、主要应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类…...
介绍下 npm 模块安装机制,为什么输入 npm install 就可以自动安装对应的模块
npm(Node Package Manager)模块安装机制是Node.js生态系统中非常重要的一部分,它允许开发者轻松管理和安装Node.js项目的依赖项。下面我将详细介绍npm模块的安装机制,以及为什么输入npm install就可以自动安装对应的模块。 npm模…...
vue2如何父组件 对象 双向绑定子组件
对于Vue 2,你不能直接用v-model绑定对象,但可以通过在子组件内部处理value prop的变化并触发input事件来模拟这一行为。 父组件A 1<template> 2 <ComponentB v-model"item" prop-names"addressId,date,startTime,endTime&quo…...
[Android]在后台线程执行耗时操作,然后在主线程更新UI
1.Coroutines(官方推荐) Coroutines 提供了一种轻量级的线程管理方式,使得在后台线程执行任务和在主线程更新 UI 变得简单。以下是如何在 Kotlin 中使用 Coroutines 来处理耗时逻辑并更新 UI 的步骤: 添加 Coroutines 依赖: 首…...
平方回文数-第13届蓝桥杯选拔赛Python真题精选
[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第73讲。 平方回文数&#…...
位置编码(三) 2D旋转位置编码
Rotary Position Embedding for Vision Transformer https://arxiv.org/abs/2403.13298 Transformer升级之路:4、二维位置的旋转式位置编码 https://kexue.fm/archives/8397 Transformer升级之路:17、多模态位置编码的简单思考 https://kexue.fm/archive…...
1、pikachu靶场之xss钓鱼复现
一、复现过程 1、payload <script src"http://127.0.0.1/pkxss/xfish/fish.php"></script> 将这段代码插入到含有储存xss的网页上,如下留言板 2、此时恶意代码已经存入数据库,并存在网页中,当另一个用户打开这个网页…...
弘君资本炒股技巧:股票定向增发是什么意思?是好是坏?
股票定向增发是指已上市的公司向指定的组织或者个人投资者额外发行股份募集资金的融资方法,发行价格为发行前某一阶段的平均价的必定比例,增发的价格不得低于前二十个买卖日股票均价的80%。 例如,个股定增前二十个买卖股票平均价为…...
vue3项目使用pinia状态管理器----通俗易懂
1、首先安装pinia yarn add pinia # 或使用npm npm install pinia 2、在项目的src目录下新建store文件夹,然后store目录下新建index.js / index.ts : 我这里是index,js import { createPinia } from "pinia"// 创建 Pinia 实例 const pinia …...
零基础学Java第二十五天之Lambda表达式
Lambda表达式 简介 Lambda是一个匿名函数(方法), 允许把函数作为一个方法的参数 。利用Lambda表达式可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。一般都是优化匿名内部类 基础语法 无参数、无返回值的抽…...
VSCode配置Lua5.4安装
参考:VSCode 配置 Lua 开发环境(清晰明了)_lua vscode-CSDN博客 1.下载 Lua Binaries Download (sourceforge.net) 2.配置环境变量 解压放到某文件夹: 环境变量: 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/...
【机器学习】机器学习基础概念与初步探索
❀机器学习 📒1. 引言📒2. 机器学习概述📒3. 机器学习基础概念🎉2.1 机器学习的分类🎉2.2 数据预处理🌈数据清洗与整合🌈 特征选择和特征工程🌈数据标准化与归一化 📒4. …...
学英语材料:单口喜剧、讲故事、短剧喜剧以及广播剧和播客节目
学习英语节目 有名的单口喜剧、讲故事、短剧喜剧以及广播剧和播客节目: 单口喜剧(Stand-up Comedy) 描述:这是最接近相声的形式,表演者独自一人站在舞台上,用幽默的方式讲述个人经历、观察到的社会现象或…...
Docker Compose使用
Docker-Compose是什么 docker建议我们每一个容器中只运行一个服务,因为doker容器本身占用资源极少,所以最好是将每个服务单独分割开来,但是这样我们又面临了一个问题: 如果我需要同时部署好多个服务,难道要每个服务单独写Docker…...
千问3.5-9B模型切换指南:OpenClaw多模型动态调用
千问3.5-9B模型切换指南:OpenClaw多模型动态调用 1. 为什么需要多模型动态调用 上周我尝试用OpenClaw自动整理电脑里积压的300多份PDF文档时,遇到了一个有趣的现象:处理简单文件重命名任务时,轻量级模型响应飞快;但遇…...
告别传统知识蒸馏:用‘逆向蒸馏’在MVTec数据集上实现98.5%的异常检测精度
逆向蒸馏:工业质检场景下的异常检测新范式 在工业质检领域,异常检测一直是计算机视觉技术落地的核心挑战之一。传统方法往往受限于样本不平衡、缺陷类型多样等问题,而基于深度学习的方案又面临标注成本高、泛化能力不足的困境。CVPR 2022提出…...
MySQL高频面试题(2026最新版):覆盖90%考点,小白也能直接背
很多开发者备考时,要么盲目刷题、记不住重点,要么只背答案、不懂原理,面试时被面试官追问一句就卡壳。其实MySQL面试没有那么复杂,核心考点就那么多,只要吃透高频题、理解底层逻辑,就能从容应对。本文整理了…...
Qwen3.5-9B-AWQ-4bit惊艳效果展示:高清图识+中文摘要真实生成作品集
Qwen3.5-9B-AWQ-4bit惊艳效果展示:高清图识中文摘要真实生成作品集 1. 模型能力概览 Qwen3.5-9B-AWQ-4bit是一款让人眼前一亮的视觉理解模型,它能像人类一样"看懂"图片内容,并用流畅的中文给出专业分析。这个模型特别擅长处理各种…...
人脸识别快速上手:Retinaface+CurricularFace镜像教程,简单易学
人脸识别快速上手:RetinafaceCurricularFace镜像教程,简单易学 1. 理解人脸识别黄金组合 在开始动手之前,我们先花两分钟了解Retinaface和CurricularFace这对黄金搭档: Retinaface:就像一位专业的摄影师,…...
磁流变半主动悬架Simulink模型创建与策略设计详解
磁流变半主动悬架simulink模型,包含模型创建,模型策略设计磁流变悬架的Simulink建模就像搭积木——你得先搞清楚每块积木该放哪儿。咱们从最基础的四分之一车模型开始,车身质量、悬架刚度这些参数直接在Simulink里拖几个Mass和Spring模块就能…...
JeecgBoot启动配置
一、引入maven指定自己的maven仓库 二、指定JDK 记得apply!!!!然后OK 三、配置MySQL数据库(尽量≥5.7版本) 四、运行db文件夹下的SQL文件 五、后端本地环境(application-dev.yml)指定好数据源 1、M…...
线性结构之链表[基于郝斌课程]
每个结点只有一个前续结点每个结点只有一个后续结点首结点没有前续结点尾结点没有后续结点专业术语:首结点:第一个有效结点,存放第一个有效数据尾结点:最后一个有效结点,存放最后一个有效数据头结点:在首结…...
SEO优化对网站收录有什么作用
SEO优化对网站收录有什么作用 在当今互联网信息爆炸的时代,网站的收录问题显得尤为重要。SEO优化对于网站的收录有着至关重要的作用,无论是对于新开的网站还是已经运营一段时间的网站,优化都能为其带来更多的流量和潜在客户。SEO优化对网站收…...
FastAPI系列 4 - 模块化路由的艺术:APIRouter实战指南
1. 为什么需要模块化路由? 第一次用FastAPI开发电商后台时,我把所有路由都堆在main.py里。三个月后这个文件膨胀到2000多行代码,每次修改用户认证逻辑都要在订单处理和商品列表的代码块之间来回翻找。这种经历让我深刻理解了为什么APIRouter会…...
