原标题:[蛮牛驿馆] Unity2D:用射线检测物体的点击

通常,在Unity里会经常使用OnMouseDown检测GameObjects上的点击。效果很好,但需要在Gameobject上挂一个脚本,而且当存在很多可点击的物体时还必须要同步。

1

另一种方法,也就是这边文章要讲到的,就是用一个脚本来管理整个游戏中的点击。一大堆的理由可以说明这是非常有用的,但主要是提供一个集中的位置来管理所有的输入以及整合整个游戏过程中的点击。举个例子,在角色的视野范围内时,在菜单关闭时,或者没有游戏内的对话框弹出时,可能只有一个Box可以被点击。在这种情况下,将点击的逻辑放在Box的脚本里,需要box有知识来访问角色、菜单和对话框系统,这样就会导致混乱的代码。在GameObjects里挂上点击事件还会导致一个问题,假如要支持多种输入,比如点击和触摸,你会发现有太多的GameObject的脚本都挂上了点击事件,而且还没达到本身的目的。

就因为上边提到的两个原因,我更偏向于用一个单一的输入脚本来管理这些点击事件以及代理被点击的物体。这样一来,当点击/触摸事件发生时,只需要简单地通知与交互相关的GameObject即可,而不用关心输入的是什么,只是有输入就行。为了实现这个设想,创建一个空GameObject,命名为Click Manger,挂上一个脚本。脚本就叫ClickManger。

2

监听点击事件

在ClickManger脚本里,用Update函数检测鼠标是否已经点击:

我们用的是Input.GetMouseButtonDown来检测是否鼠标左键(0代表左键)在当前帧被按下。也就是说,当你点击时,即使一直按着鼠标左键不放,在Update函数的循环中也仅仅返回一次true,直到释放鼠标并再次点击。对于鼠标右键用1代表,鼠标中间则是用2代表。

3

什么被点击了呢?

既然知道了点击已经发生,但是我们怎么知道具体什么被点击到了呢?因为这个脚本并不属于游戏中是实际物体(仅仅是一个空物体)我们需要用Raycast来检测到底用户点击了什么。

Raycast的实质就是在游戏场景中的两点之间“画”了一条线,检测这条线上碰撞到的任何物理物体。你就可以用碰撞获得的信息来确定碰撞到的物体并做相应处理。另一个Raycast比较有用的样例‍

有一件事情值得注意:点击的位置指的是屏幕坐标,而不是世界坐标。屏幕坐标代表像素,(0,0)点是指屏幕左下角。我们需要将屏幕坐标转换成世界坐标以正确地与场景中的GameObjects做匹配。另外一个小问题是,点击的位置包含了Z轴的坐标,在2D游戏中是不相干的,但还是会干涉到Raycast的检测,因为Z轴在2D游戏中依然是存在的,所以,我们需要忽略Z轴。

首先,在if语句中,将点击坐标转换成世界坐标:

用ScreenToWorldPoint将Input.mousePosition转换成世界坐标,这样就可以用来与GameObject相比较了。

接下来,我们用Physics2D.Raycast生成射线,提供一个Vector2类型的mousePos忽略Z轴作为起始点。还要提供一个Vector2.zero作为Raycast的方向以保证只有在点击方向的位置上的物体才可以被检测到:

现在可以用Raycast2D来确定是否有物体被点击了:

Hit.collider返回一个Collider2D,从这个Collider2D中可以访问到点击到物体的Rigibody和GameObject属性。现在我们就可以直接操作被点击到的物体!在接下来的例子中,我们只是简单地打印被点击到的物体的名字,给rigibody施加一个作用力:

按照游戏交互设计,因为你已经知道哪个物体已经被点击到了并且怎样获取该物体,你可以对被点击的物体做任何处理。愉快地点吧!

4

全部脚本

责任编辑:

2d unity 多物体 射线_[蛮牛驿馆] Unity2D:用射线检测物体的点击相关推荐

  1. 电容屏物体识别_一种基于触摸屏触摸点的物体识别方法与流程

    本发明涉及触摸屏触摸点物体识别技术领域,具体为一种基于触摸屏触摸点的物体识别方法. 背景技术: 多触点触摸屏支持多个触点同时输入,通过触摸屏的点的特征,进行物体识别是一个成熟的技术,以下简称物体识别为 ...

  2. 圆柱属于能滚动的物体吗_中班科学活动教案:滚动的物体教案(附教学反思)

    中班科学活动滚动的物体教案(附教学反思)主要包含了活动目标,活动准备,活动过程,活动反思等内容,对物体的滚动产生探究的兴趣,积极参与操作活动,感知物体滚动的特性,适合幼儿园老师们上中班科学活动课,快来 ...

  3. opencv用python进行物体识别_教你用Python+opencv来识别物体的轮廓并标识显示

    实现目标 利用USB摄像头对拍摄的物体进行轮廓识别并标识显示 打开pycharm开发工具,在项目中新建 demo.py 文件,文件代码如下: # 调用对应的库 import cv2 # 视频参数设置 ...

  4. Unity 2D检测物体碰撞

    文章目录 添加物理脚本 使用脚本检测碰撞 添加物理脚本 Unity2D中,检测物体碰撞首相要给物体添加两个属性分别是: rigibody和collider,刚体和碰撞器. collider有不同的形状 ...

  5. 分享2D Unity游戏的动画制作经验

    http://gamerboom.com/archives/76709 作者:Alex Rose Unity最近宣布推出额外的2D游戏支持,添加了Box 2D物理和一个精灵管理器. 但这里还是有些技巧 ...

  6. unity获取脚本组件_王者荣耀是怎样炼成的(三)unity组件与脚本

    上回书说到了unity的基本操作.这回我们来侃侃unity中的组件与脚本. 目录结构 一.组件与脚本简介 1.组件 组件(Component),顾名思义,就是游戏物体的组成部件. 这和我们对现实生活的 ...

  7. unity判断范围内有物体_Unity 检测物体是否在相机视野范围内

    需求: 类似NPC血条,当NPC处于摄像机视野内,血条绘制,且一直保持在NPC头顶. 开始: 网上查找资料,然后编写代码: public RectTransform rectBloodPos; voi ...

  8. android ar物体识别_如何做到从图像识别到物体识别

    在增强现实(AR)与自动驾驶的时代来临之际,3D数据呈现爆炸式增长.在不久的将来,处理3D数据的算法将应用于像机器人自动巡航.基于AR的智能用户界面等应用程序上.受此启发,我们在Matroid公司所著 ...

  9. 【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)

    需要源码和资源包请点赞关注收藏后评论区留言私信~~~ 一.效果展示 效果展示如下 射线动态的在地球上发射和接收 整个场景也是一个的动态的过程,看上去充满科技感 演示视频如下 虚拟地球射线 二.实现步骤 ...

  10. 物体识别_小鼠新物体识别Protocol

    Ennaceur 和 Delacour于 1988 年报道了一种非奖赏性的.简单的认知记忆实验模型--新物体识别实验(Novel Object Recognition, NOR),用于评估啮齿动物记忆 ...

最新文章

  1. 小程序打开文档标题乱码处理
  2. 只有2GB内存在20亿个整数中找到出现次数最多的数
  3. linux ctime 时间戳,Linux时间戳atime ctime mtime区别及相关命令
  4. Envi和ArcGIS软件打开和处理.NC4数据
  5. VS code前端配置
  6. iFrame左树目录
  7. 学机器人编程还是计算机编程,为什么要学习机器人编程课程
  8. 如何创建属于自己的域名邮箱
  9. 怎样挑选鱼头 鱼头怎么做好吃
  10. java makefile jar包_makefile PRODUCT_BOOT_JARS 处理流程及实例
  11. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 概率与期望+高斯消元
  12. 苹果芯片订单立功 台积电股价创新高
  13. 1046 mysql_MYSQL 1046 错误求助:
  14. python分析链家二手房信息----数据分析实战(一)
  15. Python - 寻找数组的子集
  16. 为什么很多企业要自研CRM系统,而不够买SAAS云服务提供的CRM系统或SCRM系统?...
  17. 【FI】SAP 付款及清账
  18. VB AES 字符串和文件加密
  19. [BZOJ4327] JSOI2012玄武密码
  20. 邮政快递单号可以批量查询吗

热门文章

  1. 数论1.0 数论基础
  2. 蓝屏dump分析教程
  3. 不那么SQL的SQL代码(一)if not exists(...) insert
  4. nuget下载太慢的问题解决方案 多次尝试下载该 nupkg 均已失败解决方案
  5. JAVA之stream汪文君_Java8新特性之Stream API
  6. 红帽认证是什么?含金量如何?
  7. C语言函数库之字符串连接函数(string.h)
  8. 图解深度学习-梯度下降学习率可视化
  9. 物联网:LoRa无线通信技术
  10. 【亲测有效】无法定位链接器!请检查 tools\link.ini 中的配置是否正确的解决方案...