(持续更新)
一、如何检测鼠标进入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单选
四、文本框自适应大小,需要在Text组件下添加ContentSizeFitter组件