当前位置:   article > 正文

Unity射线与UI碰撞检测_unity 能否检测是否碰撞到button

unity 能否检测是否碰撞到button

问题产生背景:我们有的时候,需要实现射线与3D UI之间的碰撞,当射线碰撞到3D UI之后(将Canvas设置为World Space),调整到合适的位置。使用LineRender表示射线的直观显示,使用一把枪结合第一人称控制器。当射线瞄准UI的时候,UI添加高亮边框。点击鼠标左键,调用按钮对应的函数。

(1)首先,搭建场景,最终如下所示

(2)简要说明:给Button添加Mask组件,设置对应的边框,开始的时候enable为false。当射线指向的时候,enable为true。枪口添加ray对象,作为射线的起点,并且为ray添加LineRender组件

调整必要的参数,设置Use World Space为false。

(3)给Button添加一个BoxCollider组件,调整大小正好包括Button即可

(4)新建脚本,控制射线以及碰撞,代码如下

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.UI;
  6. public class GraphicDetect : MonoBehaviour
  7. {
  8. public Transform origin; //射线起点
  9. public Button startBtn; //开始按钮
  10. public LineRenderer line;
  11. Vector3 endPoint; //LineRender结束点
  12. // Start is called before the first frame update
  13. void Start()
  14. {
  15. startBtn.onClick.AddListener(delegate ()
  16. {
  17. Debug.Log("Game Start");
  18. });
  19. endPoint = line.GetPosition(1);
  20. }
  21. // Update is called once per frame
  22. void Update()
  23. {
  24. // Physics
  25. RaycastHit hit;
  26. //需要设置射线检测层
  27. if (Physics.Raycast(origin.position, origin.forward, out hit,50))
  28. {
  29. if (hit.collider.gameObject.layer == LayerMask.NameToLayer("UI"))
  30. {
  31. //将轮廓组件显示
  32. startBtn.gameObject.GetComponent<Outline>().enabled = true;
  33. //将世界坐标转换为Local
  34. line.SetPosition(1,line.transform.InverseTransformPoint( hit.point));
  35. if (Input.GetMouseButtonDown(0))
  36. {
  37. //自动执行按钮对应的回调函数
  38. ExecuteEvents.Execute<IPointerClickHandler>(startBtn.gameObject,
  39. new PointerEventData(EventSystem.current),
  40. ExecuteEvents.pointerClickHandler);
  41. }
  42. }
  43. }
  44. else {
  45. startBtn.gameObject.GetComponent<Outline>().enabled = false;
  46. line.SetPosition(1,endPoint);
  47. }
  48. }
  49. }

(5)给该脚本必要的组件赋值,结合第一人称控制器。当枪口移动并且射线指向Button的时候,会触发按钮对应的函数并且显示边框。显示按钮的边框可以使用Shader进行实现,我这里为了演示方便,直接用的Outline。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/997440
推荐阅读
相关标签
  

闽ICP备14008679号