UNITY 用UI元素检测碰撞3d场景里的Gameobject

有时候可能会遇到需要用UGUI或者FGUI上的UI元素与相机里面的元素进行碰撞的需求
UGUI和3d物体
这里的做法只限于进行单个物体和屏幕上的元素进行碰撞检测,不适用于多个3d对象与UI元素进行碰撞检测

首先先在UI上面绑几个空节点,做好自适应之后,先求出3d物体坐标转换为屏幕坐标之后的Z轴的值
绑点,确定宽高
然后用此方法求出转换成3d节点里面的坐标位置,因为获得了z轴,因此从ui元素坐标点转换为3d世界坐标之后

 Vector3 ReturnPos(Vector3 aim) {
        Vector3 vec = Vector3.zero;
        Vector3 pos = Camera.main.WorldToScreenPoint(你所需要转换的3d物体的坐标);//将对象坐标换成屏幕坐标
        Vector3 mousePos = new Vector3(aim.x, aim.y, pos.z);//mousePos指的是ui上面绑点的点的坐标
        vec = Camera.main.ScreenToWorldPoint(mousePos);
        return vec;
    }

转换完之后,在对应的位置生成gameobject,手动添加一下boxCollide,并且设置size为2d场景里面的宽高即可,

  private void DrawLine()
    {
        Vector3 boundPos1 = ReturnPos(pos1.position);
        Vector3 boundPos2 = ReturnPos(pos4.position);
        Debug.Log("posCheck = " + boundPos1 + "=====" + boundPos2);
        float height = Mathf.Abs(boundPos2.y - boundPos1.y);
        float width = Mathf.Abs(boundPos2.x - boundPos1.x);
        float posX = (boundPos2.x + boundPos1.x) / 2;
        float posY = (boundPos2.y + boundPos1.y) / 2;
        objScreenCollider.transform.position = new Vector3(posX, posY, boundPos1.z);
        objScreenCollider.GetComponent<BoxCollider>().size = new Vector3(width, height, 1);
    }

这个gameobject可以自己提前创建预制,并且添加上包围盒,然后在预制上绑定脚本,脚本时间里面可以挂在触碰之后的逻辑。
最终结果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Unity中实现鼠标点击物体弹出UI,可以按照以下步骤进行操作: 1. 创建UI元素:首先,在场景中创建一个UI元素(例如一个Panel),将其设置为不可见。 2. 添加脚本:为UI元素添加一个脚本,用于控制其显示和隐藏。 3. 编写代码:编写代码,当鼠标点击物体时,显示UI元素。当鼠标再次点击物体时,隐藏UI元素。 以下是示例代码: ``` using UnityEngine; using UnityEngine.UI; public class ShowUIOnMouseClick : MonoBehaviour { public GameObject uiPanel; // UI元素 private bool isPanelActive = false; // UI元素是否可见 void Start() { uiPanel.SetActive(false); // 初始时,UI元素不可见 } void Update() { if (Input.GetMouseButtonDown(0)) // 当鼠标左键点击 { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 从摄像机向鼠标位置发射一条射线 RaycastHit hit; if (Physics.Raycast(ray, out hit)) // 如果射线碰撞到了物体 { if (hit.collider.gameObject == gameObject) // 如果碰撞到的物体是当前物体 { isPanelActive = !isPanelActive; // 切换UI元素的可见性 uiPanel.SetActive(isPanelActive); // 设置UI元素的可见性 } } } } } ``` 在上述代码中,我们首先在Start()方法中将UI元素设为不可见。然后,在Update()方法中,我们检测鼠标左键是否被点击,并从摄像机向鼠标位置发射一条射线。如果射线碰撞到了物体,并且该物体是当前物体,我们就切换UI元素的可见性,并设置UI元素的可见性。 注意:在使用射线检测物体时,需要保证物体上有Collider组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值