Unity 常用函数整理【一】

本文介绍了Unity开发中的一些高级技巧和实用函数,包括UGUI鼠标穿透检测、射线检测最近物体、场景跳转、自动滚动效果等,适合Unity开发者深入学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、unity 之UGUI 屏蔽鼠标(射线)穿透

方法一

  /// <summary>
  /// 检测是否点击在UI上
  /// </summary>
  /// <returns></returns>

  private bool IsClickUI()
  {
      if (EventSystem.current != null)
      {
          PointerEventData eventData = new PointerEventData(EventSystem.current);
          eventData.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
          List<RaycastResult> results = new List<RaycastResult>();
          EventSystem.current.RaycastAll(eventData, results);
          return results.Count > 0;
      }
      return false;
  }

方法二


        private void OnMouseDown()
        {
            // 如果点击的是 UI 元素,不执行后续逻辑
            if (IsPointerUI())
            {
                // 点击的是 UI 元素,不做处理
                return;
            }
            //下面执行对应点击逻辑
           
        }

        private bool IsPointerUI()
        {
            // 创建 pointerEventData
            PointerEventData pointerEventData = new PointerEventData(EventSystem.current)
            {
                position = Input.mousePosition // 获取鼠标位置
            };

            // 存储所有 UI 元素的射线结果
            var results = new List<RaycastResult>();

            // 检查与 UI 的交互
            EventSystem.current.RaycastAll(pointerEventData, results);
       
            // 如果有结果证明鼠标在 UI 上
            return results.Count > 0;
        }

方法三


    List<RaycastResult> RaycastResults = new List<RaycastResult>();
    private bool IsMouseUI(Vector3 mousePos)
    {
        var ray = Camera.main.ScreenPointToRay(mousePos);


        var ColliderDistance = float.MaxValue;

        Transform raycastTarget = null;
        if (Physics.Raycast(ray, out var raycastResult, 10000))
        {
            raycastTarget = raycastResult.transform;
            ColliderDistance = raycastResult.distance;
        }

        if (EventSystem.current != null)
        {
            PointerData.position = Input.mousePosition;

            if (RaycastResults.Count > 0)
                RaycastResults.Clear();

            EventSystem.current.RaycastAll(PointerData, RaycastResults);

            for (int i = 0; i < RaycastResults.Count; i++)
            {
                if (RaycastResults[i].distance < ColliderDistance)
                {
                    return true;
                }
            }
        }
        return false;
    }

2、射线交互多个物体  Physics.RaycastNonAlloc

    private RaycastHit[] Raycasts = new RaycastHit[10];

    private void RayObject()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        for (int i = 0; i < Raycasts.Length; i++)
        {
            Raycasts[i].distance = 999;
        };
        int count = Physics.RaycastNonAlloc(ray, Raycasts);
        if (count > 0)
        {
            //for (int i = 0; i < count; i++)
            //{
            //    var hit = Raycasts[i];
            //    OnRayClick(hit.transform
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值