Unity 模拟百度地图,使用鼠标控制图片在固定区域内放大、缩小、鼠标左键拖拽移动图片

效果展示:

步骤流程:

1.使用的是UGUI,将下面的脚本拖拽到图片上即可。

cs 复制代码
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class CheckImage : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler
{
    public float MaxRange = 5f;
    public float MinRange = 0.5f;
    private Vector3 offPos;
    private Vector3 arragedPos;
    private bool isEnter = false;
    private bool isDrag = false;

    void Update()
    {
        if (!isEnter) return;
        if (!isDrag)
        {
            SetPivotAndPos();
            if (Input.GetAxis("Mouse ScrollWheel") > 0)
            {
                transform.localScale += (transform.localScale.x >= MaxRange ? Vector3.zero : Vector3.one * 0.1f);
            }
            else if (Input.GetAxis("Mouse ScrollWheel") < 0)
            {
                transform.localScale -= (transform.localScale.x <= MinRange ? Vector3.zero : Vector3.one * 0.1f);
            }
        }
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        isDrag = true;
        if (RectTransformUtility.ScreenPointToWorldPointInRectangle(transform.GetComponent<RectTransform>(), Input.mousePosition, null, out arragedPos))
        {
            offPos = transform.position - arragedPos;
        }
    }

    public void OnDrag(PointerEventData eventData)
    {
        transform.position = offPos + Input.mousePosition;
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        transform.position = offPos + Input.mousePosition;
        isDrag = false;
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        isEnter = true;
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        isEnter = false;
    }

    private void SetPivotAndPos()
    {
        float OffsetX = Input.mousePosition.x - transform.position.x;
        float OffsetY = Input.mousePosition.y - transform.position.y;

        float PivotX = OffsetX / transform.GetComponent<RectTransform>().rect.width / transform.localScale.x;
        float PivotY = OffsetY / transform.GetComponent<RectTransform>().rect.height / transform.localScale.y;

        transform.GetComponent<RectTransform>().pivot += new Vector2(PivotX, PivotY);
        transform.localPosition += new Vector3(OffsetX, OffsetY, 0);
    }
}

2.再给图片的父物体添加个Mask遮罩就ok了。

相关推荐
XR技术研习社13 分钟前
从 PICO 文档看未来短期内的 Unity 版本选择
unity·游戏引擎·xr·vr
不想看见40417 分钟前
一次关于“鼠标是不是串口”的追问:从USB协议到CAN总线
c++·qt·计算机外设
驱动小百科1 小时前
雷柏鼠标驱动下载教程:雷柏鼠标驱动怎么安装
计算机外设·雷柏鼠标驱动下载·雷柏鼠标驱动·雷柏鼠标驱动安装·雷柏鼠标驱动官网
玖玥拾3 小时前
Unity 热更新(一)
unity·游戏引擎
软件黑马王子3 小时前
1.non-MonoBehaviour 单例模式泛型基类
unity·前端框架·c#
KhalilRuan15 小时前
Unity性能优化
unity·性能优化·游戏引擎
ellis197016 小时前
u3d IMGUI[二] 编辑器扩展
unity
playboy1341 天前
NAS不能访问共享文件夹数据恢复
大数据·计算机外设
卢锡荣1 天前
一线通桌面显示器优选芯|乐得瑞 LDR6021Q
计算机外设
五仁烧饼1 天前
Unity性能优化系列内存篇 - 移动端内存优化
unity·性能优化·游戏引擎