(功能展示,放大效果)
需要两张图片来实现,一个image组件,一个rwaimage组件
image用于展示需要放大的图片
rwaimage用来显示放大区域,通过修改uv来显示
随便创建个空物体挂载此脚本并赋值
具体实现脚本如下:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class AutoMagnifyOnHover : MonoBehaviour
{
public Image productImage;
public RawImage zoomedInImage;
public float zoomFactor = 2f;
public Vector2 zoomedSize = new Vector2(100, 100);
private RectTransform productImageRect;
private RectTransform canvasRect;
private RectTransform zoomedInRect;
private bool isMouseOver = false;
void Start()
{
productImageRect = productImage.GetComponent<RectTransform>();
canvasRect = GetComponent<RectTransform>();
zoomedInRect = zoomedInImage.GetComponent<RectTransform>();
HideZoomedInImage();
}
void Update()
{
CheckMouseOver();
UpdateZoomedInImage();
}
void CheckMouseOver()
{
Vector2 localMousePos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(productImageRect, Input.mousePosition, null, out localMousePos);
isMouseOver = productImageRect.rect.Contains(localMousePos);
}
void UpdateZoomedInImage()
{
if (isMouseOver)
{
Vector2 localMousePos;
RectTransformUtility.ScreenPointToLocalPointInRectangle(productImageRect, Input.mousePosition, null, out localMousePos);
Vector2 normalizedMousePos = new Vector2(
Mathf.InverseLerp(0, productImageRect.rect.width, localMousePos.x+150),
Mathf.InverseLerp(0, productImageRect.rect.height, localMousePos.y+150)
);
Vector2 uv = new Vector2(
Mathf.InverseLerp(0, productImageRect.rect.width, localMousePos.x + 150),
Mathf.InverseLerp(0, productImageRect.rect.height, localMousePos.y + 150)
);
zoomedInImage.uvRect = new Rect(uv.x - 0.5f / zoomFactor, uv.y - 0.5f / zoomFactor, 1 / zoomFactor, 1 / zoomFactor);
ShowZoomedInImage();
}
else
{
HideZoomedInImage();
}
}
void ShowZoomedInImage()
{
zoomedInImage.gameObject.SetActive(true);
}
void HideZoomedInImage()
{
zoomedInImage.gameObject.SetActive(false);
}
}