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;
}
}
}
3D沙盘地图的拖动与缩放
于 2022-03-30 10:24:47 首次发布