Unity UI 常用方法基本知识点

565 阅读2分钟

一、如何检测鼠标进入UI,或者检测鼠标进入指定UI?

在命名空间 using UnityEngine.EventSystems;当中,实现接口 IPointerEnterHandler 和 IPointerExitHandler,其中OnPointerEnter是鼠标进入UI后调用,OnPointerExit是鼠标离开UI后调用

using UnityEngine;
using UnityEngine.EventSystems;
public class GridUI : MonoBehaviour,IPointerEnterHandler,IPointerExitHandler
{
    /// <summary>
    /// 鼠标进入调用
    /// </summary>
    public void OnPointerEnter(PointerEventData eventData)
    {
        if (eventData.pointerEnter.tag == "Grid")
        {
            Debug.Log("鼠标进入了" + transform.name);
        }
    }
    /// <summary>
    /// 鼠标离开调用
    /// </summary>
    public void OnPointerExit(PointerEventData eventData)
    {
        if (eventData.pointerEnter.tag == "Grid")
        {
            Debug.Log("鼠标离开了" + transform.name);
        }
    }
}

二、屏幕坐标转换为相对坐标的方法

Vector2 position;
//参数一是相对与谁的坐标,参数二是谁的坐标要转换,参数三是相机,参数四返回转换后的坐标
RectTransformUtility.ScreenPointToLocalPointInRectangle(transform as RectTransform, Input.mousePosition, null, out position);

三、UI拖拽功能的实现

首先我们需要引入 UnityEngine.EventSystems; 命名空间,然后继承该命名空间下的几个接口并实现其中的方法 要继承的接口:IBeginDragHandler, IDragHandler, IEndDragHandler 然后实现其中的方法

#region UI的拖拽
    public static Action<Transform> OnMyBeginDrag;
    public static Action<Transform,Transform> OnMyEndDrag;
    /// <summary>
    /// 当开始拖拽
    /// </summary>
    public void OnBeginDrag(PointerEventData eventData)
    {
        if (eventData.button == PointerEventData.InputButton.Left)
        {
//eventData.pointerEnter当中保存的是我们的鼠标碰到的UI
            if (eventData.pointerEnter.transform.tag == "Grid" && eventData.pointerEnter.transform.childCount != 0)
            {
                OnMyBeginDrag?.Invoke(transform);
            }
        }
    }
    /// <summary>
    /// 拖拽过程中
    /// </summary>
    public void OnDrag(PointerEventData eventData)
    {
        if (eventData.button == PointerEventData.InputButton.Left)
        {
 
        }
    }
    /// <summary>
    /// 完成拖拽
    /// </summary>
    public void OnEndDrag(PointerEventData eventData)
    {
        if (eventData.button == PointerEventData.InputButton.Left)
        {
                OnMyEndDrag?.Invoke(transform,eventData.pointerEnter == null ? null : eventData.pointerEnter.transform);
        }
    }
    #endregion

当我们开始拖拽的时候通过委托将消息发送出去,让接收者实现拖拽的功能,这里分享一个屏幕坐标转换的方法

if (isDrag)
            {
                Vector2 position;
//我们鼠标的屏幕坐标转换为我们的某面板下的坐标,我是这么理解的,参数一传入面板或者Canvas的RectTransform,参数二是我们要转换的原始坐标,参数三是转换后我们得到的坐标
                RectTransformUtility.ScreenPointToLocalPointInRectangle(transform as RectTransform, Input.mousePosition, null, out position);
//拖拽逻辑
                dragItemUI.Show(position);
            }

四、一组Toggle组件如何设置单选模式

我们要把一组Toggle设置为单选模式,首先选中我们的游戏对象ToggleGroup,然后添加一个组件ToggleGroup的组件如图:

然后我们将所有的toggle组件选中,将ToggleGroup赋值给如图所示的位置,即可实现该组Toggle单选

image.png

五、文本框自适应大小,需要在Text组件下添加ContentSizeFitter组件

image.png