一个侧边栏自动隐藏小组件。留作备用。
效果预览:
鼠标移进区域显示,移出区域隐藏。
需使用Dotween插件。
需要使用一张图片作为检测区,图片设置为全透明。
代码如下:
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public enum Direction
{
up,
down,
left,
right
}
/// <summary>
/// 边缘自动隐藏组件
/// </summary>
public class AutoHideItem : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
/*
1.挂载的物体需要有Image组件
2.如果自动隐藏的物体里有按钮等需要检测射线的东西,如:按钮,toggle等,则自动隐藏物体需要成为此物体的子物体
3.项目中需要包含有DoTween插件
*/
//[Header ("检测鼠标的物体")]
//public RectTransform selfObj;
[Header ("需要显隐的物体")]
public RectTransform moveObj;
[Tooltip ("隐藏方向")]
public Direction dir = Direction.right;
[Header ("动画时间")]
public float duration = 0.4f;
//[Header("多久自动隐藏")]
//public float autoHdieTime = 1f;
float height; //高度
float width; //宽度
Vector2 originPos; //初始位置
private void Awake()
{
//if (selfObj == null)
//{
// selfObj = transform.GetComponent<RectTransform>();
//}
if (moveObj == null)
{
moveObj = transform.Find("Viewport").GetComponent<RectTransform>();
}
//去掉移动物体的射线检测
try
{
moveObj.GetComponent<Image>().raycastTarget = false;
}
catch (System.Exception)
{
throw;
}
}
void Start()
{
height = moveObj.rect.height;
width = moveObj.rect.width;
//记录初始位置
originPos = moveObj.anchoredPosition;
}
void Show()
{
switch (dir)
{
case Direction.up:
case Direction.down:
moveObj.DOAnchorPosY(originPos.y, duration).SetEase(Ease.OutQuart);
break;
case Direction.left:
case Direction.right:
moveObj.DOAnchorPosX(originPos.x, duration).SetEase(Ease.OutQuart);
break;
default:
break;
}
}
void Hide()
{
switch (dir)
{
case Direction.up:
moveObj.DOAnchorPosY(originPos.y + height, duration).SetEase(Ease.OutQuart);
break;
case Direction.down:
moveObj.DOAnchorPosY(originPos.y - height, duration).SetEase(Ease.OutQuart);
break;
case Direction.left:
moveObj.DOAnchorPosX(originPos.x - width, duration).SetEase(Ease.OutQuart);
break;
case Direction.right:
moveObj.DOAnchorPosX(originPos.x + width, duration).SetEase(Ease.OutQuart);
break;
default:
break;
}
}
public void OnPointerEnter(PointerEventData eventData)
{
Show();
}
public void OnPointerExit(PointerEventData eventData)
{
Hide();
}
}