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嵌套函数使用指南:从基础到实战应用
对中国佛教造像审美的现实性和艺术性之分析
健身后及时补充营养是否会影响身高
黑眼圈靠睡觉能恢复吗?全方位解析黑眼圈成因与改善方案
十道经典腊肉的菜谱,腊肉十吃,哪种最勾魂?
“假带娃”模式正在蔓延:很多父母浑然不知,苦的终究是孩子
2025年个人养老金退税攻略 一篇解决你最关心的10个问题
4种漂亮花很常见,别在家里养,不是迷信,老花匠的话要听
企业如何高效吸引优秀人才?这份招聘解决方案请收好
《怪物猎人:荒野》NPC猎人经过慎重平衡 不会抢戏
社保卡密码怎么设置?
如何在服务器上进行网络优化
桂花开花的方法和注意事项
用过的艾绒还有用吗?三种实用再利用方法
年小月半大:元宵节比过年还重要?春节与元宵节的文化权重之争!
如何追踪新股上市信息
和尚鹦鹉多久可以繁殖?了解繁殖周期与注意事项
张继科开新账号直播,做乒乓教学:高级课程班学生30人,学费为每月9800元
3岁宝宝一日三餐食谱:营养均衡,助力健康成长
哪些食物猫猫绝对不能吃
北京卤煮十大排名,这些店,哪家最好吃?
创业团队如何制定目标
陈金雄:数字化转型为医院新质生产力匹配“新方案”
石斛冲泡有技巧!行家建议:掌握水温水量,养生效果更佳!
电子抓拍违章怎么处理?详解处理流程与网上办理条件
专家推荐:猴头菇这样搭配最养胃
清北学霸总结的100个实用学习技巧!
袁隆平:中国农业科学家,国际粮食安全领域的开创者
房屋转租法律指南:转租是否需要房东同意?
香港真实薪资水平是多少?2024年一半家庭月入3万+!