Unity动态锚点缩放UI实现方案
创作时间:
作者:
@小白创作中心
Unity动态锚点缩放UI实现方案
引用
CSDN
1.
https://m.blog.csdn.net/weixin_41741510/article/details/144563180
在Unity UGUI开发中,我们经常需要实现图片缩放功能,传统的缩放方式通常是以UI元素的中心点为基准进行缩放,这种方式在某些场景下可能不够直观。本文将介绍一种以鼠标位置为基准点的动态锚点缩放方案,让缩放效果更加自然和符合用户预期。
一、效果演示
三、完整代码
using UnityEngine;
using UnityEngine.EventSystems;
public class MapScrollerActivePivot : MonoBehaviour, IBeginDragHandler, IDragHandler, IPointerEnterHandler, IPointerExitHandler
{
private Vector3 lastMousePosition;
private RectTransform rectTransform;
bool isHover;
private void Start()
{
rectTransform = GetComponent<RectTransform>();
}
private void Update()
{
if (isHover)
{
SetPivotWithMousePos(rectTransform);
Scale(Input.GetAxis("Mouse ScrollWheel") * 2f);
}
}
public void Scale(float scaleMultiplier, float minScale = -1)
{
if (scaleMultiplier == 0)
{
return;
}
var scale = transform.localScale;
scale *= 1 + scaleMultiplier;
if (minScale != -1 && scale.x < minScale)
{
scale = Vector3.one * minScale;
}
transform.localScale = scale;
}
public void OnBeginDrag(PointerEventData eventData)
{
lastMousePosition = Input.mousePosition;
}
public void OnDrag(PointerEventData eventData)
{
Vector3 delta = Input.mousePosition - lastMousePosition;
Vector3 newPosition = transform.position + delta;
transform.position = newPosition;
lastMousePosition = Input.mousePosition;
}
/// <summary>
/// 设置UI元素的pivot,不改变位置
/// </summary>
/// <param name="rectTransform">需要设置pivot的RectTransform </param>
public void SetPivotWithMousePos(RectTransform rectTransform)
{
Vector3 point = rectTransform.position;
Vector3 sizeDelta = rectTransform.sizeDelta;
Vector3 pivot = rectTransform.pivot;
Vector3 mouseLocalPoint = rectTransform.InverseTransformPoint(Input.mousePosition);
// 计算新的 pivot
float x = (mouseLocalPoint.x + (pivot.x * sizeDelta.x)) / sizeDelta.x;
float y = (mouseLocalPoint.y + (pivot.y * sizeDelta.y)) / sizeDelta.y;
// 设置新的 pivot
rectTransform.pivot = new Vector2(x, y);
// 计算新的 position
point.x += (x - pivot.x) * rectTransform.localScale.x * sizeDelta.x;
point.y += (y - pivot.y) * rectTransform.localScale.y * sizeDelta.y;
// 检查新位置是否有效
if (!float.IsNaN(point.x) && !float.IsNaN(point.y) && !float.IsNaN(point.z))
{
rectTransform.position = point;
}
else
{
Debug.Log("计算的新位置无效: " + point);
}
}
public void OnPointerEnter(PointerEventData eventData)
{
isHover = true;
}
public void OnPointerExit(PointerEventData eventData)
{
isHover = false;
}
}
四、总结
技术要点总结:
- 动态Pivot计算:通过InverseTransformPoint将鼠标世界坐标转换为UI元素本地坐标,实现精确的锚点计算。
- 位置补偿:修改Pivot会导致UI元素位置变化,需要通过计算偏移量来保持位置不变。
- 缩放控制:支持最小缩放限制,防止过度缩小导致的问题。
- 拖拽实现:使用EventSystem的拖拽接口,确保拖拽操作的准确性。
热门推荐
北科院城市系统所在京津冀区域协同政策模拟方面取得新进展
手机照片管理全攻略:从基础分类到云端备份
开源贡献者是什么?从入门到权益保护的全面指南
Excel列缩进设置完全指南:四种实用方法详解
如何在 Excel 单元格中插入制表符(4 种简单方法)
把自己视作人生的主人公有利于心理健康
引力波:时空涟漪的探索与宇宙奥秘
肾结石患者的饮食指南:六大要点助你远离结石困扰
新手爸妈必读!0-6 个月宝宝的安全守则,远离这些隐患!
阴阳五行的概念及其深层含义解析
清华官宣:大一上成绩不计入GPA!多校绩点改革,保研不内卷了?
如何通过三控三管一协调提升项目管理效率?
《诛仙世界》汐灵汐职业攻略:强度、天书加点、属性、星魄、法宝选择及技能解析
家里装修必看!门槛台阶的5个关键细节,90%家庭都踩过坑
铝挤压工艺:技术、优点与应用
玄关怎么设计好,提升家居生活品质
高净值人群的标准,高净值人群标准
种植牙是否适合老年人群体?老年人做种植牙的注意事项与建议
网格布检测:从标准到应用的全面解析
双模对讲机的三大优势
养狗前的自我评估:从生活方式到经济能力的全方位考量
墨尔本胜利和阿德莱德联赛事前瞻3.29分享
一文了解当前全球投资环境变化、机会与风险
一次搞定!10种厨房专用地板材料优缺点大揭密
个人成长的四维思维框架:以发展的眼光看问题
斗破苍穹:药老因韩枫背刺失踪后,这5人最着急
2025年西安工业大学MBA考试科目及内容是什么
制造钻石需要多少温度?探索钻石创造背后的科学
为什么要开发AES67?
AGV无人车远程控制方案(基于4G网络)