经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » unity » 查看文章
Unity 如何获取鼠标停留位置下的物体
来源:jb51  时间:2021/4/12 18:59:57  对本文有异议

根据UGUI的射线检测机制获取当前鼠标下的UI:

  1. /// <summary>
  2. /// 获取鼠标停留处UI
  3. /// </summary>
  4. /// <param name="canvas"></param>
  5. /// <returns></returns>
  6. public GameObject GetOverUI(GameObject canvas)
  7. {
  8. PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
  9. pointerEventData.position = Input.mousePosition;
  10. GraphicRaycaster gr = canvas.GetComponent<GraphicRaycaster>();
  11. List<RaycastResult> results = new List<RaycastResult>();
  12. gr.Raycast(pointerEventData, results);
  13. if (results.Count != 0)
  14. {
  15. return results[0].gameObject;
  16. }
  17. return null;
  18. }

其中,results为鼠标下UI的列表。

不仅适用于UGUI,可以在摄像机上添加PhysicsRaycaster组件,传参为摄像机,这样就可以获取3D物体。

  1. /// <summary>
  2. /// 获取鼠标停留处物体
  3. /// </summary>
  4. /// <param name="raycaster"></param>
  5. /// <returns></returns>
  6. public GameObject GetOverGameObject(GameObject raycaster)
  7. {
  8. PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
  9. pointerEventData.position = Input.mousePosition;
  10. PhysicsRaycaster pr = raycaster.GetComponent<PhysicsRaycaster>();
  11. List<RaycastResult> results = new List<RaycastResult>();
  12. pr.Raycast(pointerEventData, results);
  13. if (results.Count != 0)
  14. {
  15. return results[0].gameObject;
  16. }
  17. return null;
  18. }

刚遇到一个问题,我的UI点击包括3D物体点击都是用的EventSystem,也就是上面的方法,这时用

UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject()这个方法去判断鼠标是否在UI上,就会出现鼠标在3D物体上也会拿到返回值,(没有去研究传参index的用法),直接选择了上面获取UI的获取方法。

脚本:

  1. /************************************************************
  2. * 版本声明:v1.0.0
  3. * 类 名 称:MouseOverController.cs
  4. * 创建日期:2019/8/10 16:10:44
  5. * 作者名称:末零
  6. * 功能描述:获取鼠标停留处的物体
  7. ************************************************************/
  8. using System.Collections.Generic;
  9. using UnityEngine;
  10. using UnityEngine.EventSystems;
  11. using UnityEngine.UI;
  12. namespace LastZero.Utility
  13. {
  14. public class MouseOverController
  15. {
  16. /// <summary>
  17. /// 获取鼠标停留处UI
  18. /// </summary>
  19. /// <param name="canvas"></param>
  20. /// <returns></returns>
  21. public static GameObject GetOverUI(GameObject canvas)
  22. {
  23. PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
  24. pointerEventData.position = Input.mousePosition;
  25. GraphicRaycaster gr = canvas.GetComponent<GraphicRaycaster>();
  26. List<RaycastResult> results = new List<RaycastResult>();
  27. gr.Raycast(pointerEventData, results);
  28. if (results.Count != 0)
  29. {
  30. return results[0].gameObject;
  31. }
  32. return null;
  33. }
  34. /// <summary>
  35. /// 获取鼠标停留处UI
  36. /// </summary>
  37. /// <param name="canvas"></param>
  38. /// <returns></returns>
  39. public static GameObject GetOverGameObject(GameObject camera)
  40. {
  41. if (camera.GetComponent<PhysicsRaycaster>() == null)
  42. camera.AddComponent<PhysicsRaycaster>();
  43. PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
  44. pointerEventData.position = Input.mousePosition;
  45. PhysicsRaycaster gr = camera.GetComponent<PhysicsRaycaster>();
  46. List<RaycastResult> results = new List<RaycastResult>();
  47. gr.Raycast(pointerEventData, results);
  48. if (results.Count != 0)
  49. {
  50. return results[0].gameObject;
  51. }
  52. return null;
  53. }
  54. }
  55. }

补充:unity中鼠标经过一个物体时出现提示

首先被检测的物体要有collider

  1. using UnityEngine;
  2. using System.Collections;
  3. public class Cube : MonoBehaviour {
  4. // public Transform cube;
  5. bool isShowTip;
  6. // // Use this for initialization
  7. void Start () {
  8. isShowTip=false;
  9. }
  10. void OnMouseEnter () {
  11. isShowTip=true;
  12. //Debug.Log (cube.name);//可以得到物体的名字
  13. }
  14. void OnMouseExit () {
  15. isShowTip=false;
  16. }
  17. void OnGUI () {
  18. if (isShowTip){
  19. GUI.Label(new Rect(Input.mousePosition.x,Screen.height-Input.mousePosition.y,100,40),"afdasdfasdf");
  20. }
  21. }
  22. }

补充:Unity中UGUI中获取鼠标点击位置以及UI物体的屏幕坐标

鼠标点击位置:

直接访问Input.mousePosition属性,返回一个三维屏幕坐标,即鼠标的坐标。

UI物体的屏幕坐标:

RectTransformUtility.WordToScreenPoint(Camera.main, rectTransform.position),返回的是二维屏幕坐标。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。如有错误或未考虑完全的地方,望不吝赐教。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号