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

Unity3D在2D游戏中获取触屏物体的方法

我们的需求是:

假如屏幕中一个棋盘,每个棋子是button构成的,我们希望手指或者鼠标在哪里,就显示那个位置的button信息。

网上有很多获取触屏物体信息的信息的方法如下面代码所示:

Camera cam = Camera.main; // pre-defined
...if (touch.phase == TouchPhase.Bagan)){ // 如果触控点状态为按下Ray ray = cam.ScreenPointToRay(Input.position);RaycastHit hit;if (Physics.Raycast(ray, out hit)){Debug.Log(hit.transform.name); // 输出点击物体名称startTouchPos = touch.position;} 
}

但是在实际测试时,发现可以进入到if (touch.phase == TouchPhase.Bagan))这个分支中,但是Physics.Raycast(ray, out hit)始终返回false。

错误1:Physics.Raycast方法只适用于3D场景

翻阅资料发现:Physics.Raycast方法适用于3D场景下,在2D场景下是不会起作用的。

于是我们找到了2D场景下的替代方法:Physics2D.Raycast()

该方法最简单的定义如下:

public static RaycastHit2D Raycast(Vector2 origin, Vector2 direction)

需要传入两个参数:origin是射线发射的起始位置,direction是射线的方向。

为了测试效果,我们制作了demo如下:

RayHandler对象对应的脚本RayHandler.cs如下:

public class RayHandler : MonoBehaviour
{// Start is called before the first frame updateprivate Camera _camera;void Start(){_camera = Camera.main;  }// Update is called once per framevoid Update(){Vector2 direction = Input.mousePosition - Camera.main.transform.position;RaycastHit2D hit = Physics2D.Raycast(Camera.main.transform.position, direction);Debug.DrawRay(Camera.main.transform.position, direction, Color.red, 30f);if (hit.collider != null){Debug.Log("true");}}
}

加入Debug.DrawRay(Camera.main.transform.position, direction, Color.red, 30f);是为了更方便地观察到射线的情况。

我们发现射线(红色线段)穿透button的次数大大多于true日志的次数。

这个方案还有个缺陷:如果从一个点发出射线,当出发点和终点之间有其他物体时,射线检测到的是另一个物体,而不是当前鼠标(触屏点)对应的物体。

错误2:普通UI如Image、Button等一般用射线是不起作用的。

EventSystem.current.RaycastAll()可以将当前屏幕上的所有可检测的物体全部检测到,该方法需要自己构造一个PointerEventData参数传入检测的点坐标。

参考代码如下:

 void Update(){PointerEventData pointerData = new PointerEventData(EventSystem.current);pointerData.position = Input.mousePosition;List<RaycastResult> results = new List<RaycastResult>();EventSystem.current.RaycastAll(pointerData, results);if (results.Count > 0) {foreach (RaycastResult r in results) {if (r.gameObject.layer == LayerMask.NameToLayer("button")) {Debug.Log(r.gameObject.name);}}}}

针对Button1和Button2添加了button的layer,这样就可以过滤出我们想要的物体。

另外我做了测试,创建了Empty、2D Object,使用Physics2D.RaycastAll也没有生效

测试的代码如下:

    void Update(){Vector3 pos = GetTouchPosition();Ray myRay = Camera.main.ScreenPointToRay(pos);RaycastHit2D[] hits = Physics2D.RaycastAll(new Vector2(myRay.origin.x, myRay.origin.y), Vector2.zero);if(hits.Length > 0){Debug.Log("true");}}public static Vector3 GetTouchPosition(){return Input.mousePosition;}

可能Physics2D.RaycastAll适用于一个游戏Player向另一个物体发射射线,而不是从触屏点发射射线。反正从触屏点通过Physics.Raycast类函数发射射线我始终没有成功过!!!!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Spring Boot-自定义banner
  • ASP.NET Core 入门教学十七 GraphQL入门指南
  • 触想内嵌式工业一体机应用于智能检票机改善旅游体验
  • How can I provide a RGBA png file to OpenAI PHP library
  • 【LeetCode】07.整数反转
  • 系统架构师考试学习笔记第三篇——架构设计高级知识(18)面向服务架构设计理论与实践
  • DFS算法专题(一)——二叉树中的深搜【回溯与剪枝的初步注入】
  • 分类预测|基于蜣螂优化极限梯度提升决策树的数据分类预测Matlab程序DBO-Xgboost 多特征输入单输出 含基础模型
  • MySQL 默认事务隔离级别及原因
  • 数组与贪心算法——409、621(1中1简)
  • 游卡,三七互娱,得物,顺丰,快手,oppo,康冠科技,途游游戏,埃科光电25秋招内推
  • notepad++将换行替换成空
  • c++一个数因子和(快速求解)
  • C++ 设计模式——解释器模式
  • 契约锁亮相2024帆软第六届智数大会,助力业务数据安全可信
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • ES6 ...操作符
  • HTML5新特性总结
  • Python - 闭包Closure
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 阿里云Kubernetes容器服务上体验Knative
  • 分享几个不错的工具
  • 经典排序算法及其 Java 实现
  • 如何优雅地使用 Sublime Text
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 数组大概知多少
  • 算法-图和图算法
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 系统认识JavaScript正则表达式
  • 一个项目push到多个远程Git仓库
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 正则与JS中的正则
  • C# - 为值类型重定义相等性
  • 树莓派用上kodexplorer也能玩成私有网盘
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (12)Hive调优——count distinct去重优化
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (C++17) optional的使用
  • (C语言)球球大作战
  • (MATLAB)第五章-矩阵运算
  • (三分钟)速览传统边缘检测算子
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)Unity3DUnity3D在android下调试
  • (转)Windows2003安全设置/维护
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • ***原理与防范
  • *p++,*(p++),*++p,(*p)++区别?
  • .gitignore文件_Git:.gitignore
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net framework4与其client profile版本的区别
  • .net 简单实现MD5