3D沙盘地图的拖动与缩放

本文介绍了一个Unity脚本,该脚本实现了通过鼠标控制物体的缩放和平移,并限制了物体的移动范围,同时提供了重置物体大小和位置的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Zoom : MonoBehaviour
{
    private Vector3 targetScreen;// 目标物体的屏幕空间坐标  
    private Vector3 targetWorld;// 目标物体的世界空间坐标  
    private Transform target;// 目标物体的空间变换组件  
    private Vector3 mouseScreen;// 鼠标的屏幕空间坐标  
    private Vector3 offset;// 偏移 
    private Vector3 start;//初始位置

    float maxX,maxZ,minX,minZ;

    void Awake() 
    {
        target = transform;
        start = transform.position;
    }

    private void Update()
    {
        ScrollWheelControl();
        //GetKeyDown();
    }

    IEnumerator OnMouseDown()
    {
        // 把目标物体的世界空间坐标转换到它自身的屏幕空间坐标   
        targetScreen = Camera.main.WorldToScreenPoint(target.position);

        // 存储鼠标的屏幕空间坐标(Z值使用目标物体的屏幕空间坐标)   
        mouseScreen = new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetScreen.z);

        // 计算目标物体与鼠标物体在世界空间中的偏移量   
        offset = target.position - Camera.main.ScreenToWorldPoint(mouseScreen);

        // 鼠标左键按下   
        while (Input.GetMouseButton(0))
        {
            // 存储鼠标的屏幕空间坐标(Z值使用目标物体的屏幕空间坐标)
            mouseScreen = new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetScreen.z);

            // 把鼠标的屏幕空间坐标转换到世界空间坐标(Z值使用目标物体的屏幕空间坐标),加上偏移量,以此作为目标物体的世界空间坐标
            targetWorld = Camera.main.ScreenToWorldPoint(mouseScreen) + offset;

            //将物体的高度固定
            targetWorld = new Vector3(targetWorld.x, 3.029f, targetWorld.z);

            //限制可视区域
            if (targetWorld.x > maxX)
                targetWorld = new Vector3(maxX, targetWorld.y, targetWorld.z);
            if (targetWorld.z > maxZ)
                targetWorld = new Vector3(targetWorld.x, targetWorld.y, maxZ);
            if (targetWorld.x < minX)
                targetWorld = new Vector3(minX, targetWorld.y, targetWorld.z);
            if (targetWorld.z < minZ)
                targetWorld = new Vector3(targetWorld.x, targetWorld.y, minZ);

            // 更新目标物体的世界空间坐标   
            target.position = targetWorld;

            // 等待固定更新
            yield return new WaitForFixedUpdate();
        }
    }

    void ScrollWheelControl()//鼠标滑轮滚动控制物体大小
    {
        float scaleOffset = Input.GetAxis("Mouse ScrollWheel");
        if ((transform.localScale.x + scaleOffset) <= 2 && (transform.localScale.x + scaleOffset) >= 1)
        {
            transform.localScale = new Vector3(transform.localScale.x + scaleOffset, transform.localScale.y + scaleOffset, transform.localScale.z + scaleOffset);
            maxX = 3 * (transform.localScale.x - 1);
            maxZ = 3 * (transform.localScale.x - 1);
            minX = -3 * (transform.localScale.x - 1);
            minZ = -3 * (transform.localScale.x - 1);
            if (scaleOffset < 0)//缩放的时候逐渐返回原点(防止缩放后视界停留在最大视界外)
            {
               transform.position = Vector3.MoveTowards(transform.position, new Vector3(0, 3.029f, 0), 0.5f);
            }
        }
        
    }
    void GetKeyDown()//按键操作集合
    {
        if (Input.GetKeyDown(KeyCode.R))
        {
            transform.localScale = new Vector3(1,1,1);
            transform.position = start;
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值