using UnityEngine; using System.Collections; using System.Collections.Generic; public class CameraControl : MonoBehaviour { public Transform center; private Vector3 Center; //ScrollWheel private int MouseWheelSensitivity = 2; private int MouseZoomMin = 1; private int MouseZoomMax = 200; public float normalDistance = 6; private Vector3 normalized; private Vector3 temp = new Vector3(0,0,0); //Rotation private float xSpeed = 250.0f; private float ySpeed = 120.0f; private int yMinLimit = 0; private int yMaxLimit = 80; public bool needDamping = false; //调整摄像机 private float damping = 5.0f; private float x = 0.0f; private float y = 0.0f; private float movingSpeed = 0.5f; private Quaternion rotation = Quaternion.Euler(new Vector3(30f, 0f, 0f)); void Start() { Center = center.position; float z = center.transform.position.z - normalDistance; //transform.position = rotation * new Vector3(transform.position.x, transform.position.y, z); transform.LookAt(center); var angles = transform.eulerAngles; x = angles.y; y = angles.x; } void LateUpdate() { Center = center.position; //左键旋转 if (Input.GetMouseButton(0)) RotationCamera(); //滚轮缩放 else if (Input.GetAxis("Mouse ScrollWheel") != 0) MouseWheel(); //中键平移 //else if (Input.GetMouseButton(2)) HVMoveCamera(); } float ClampAngle(float angle, float min, float max) { if (angle < -360) angle += 360; if (angle > 360) angle -= 360; return Mathf.Clamp(angle, min, max); } public void RotationCamera() { x += Input.GetAxis("Mouse X") * xSpeed * 0.02f; y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f; y = ClampAngle(y, yMinLimit, yMaxLimit); var rotation = Quaternion.Euler(y, x, 0); var position = rotation * new Vector3(0.0f, 0.0f, -normalDistance) + Center; if (needDamping) { transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * damping); transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * damping); } else { transform.rotation = rotation; transform.position = position; } } public void MouseWheel() { normalized = (Center - transform.position).normalized; if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax) { normalDistance -= Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity; temp = Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity * normalized; } if (normalDistance < MouseZoomMin) { normalDistance = MouseZoomMin; temp.Set(0, 0, 0); } if (normalDistance > MouseZoomMax) { normalDistance = MouseZoomMax; temp.Set(0, 0, 0); } transform.position += temp; } public void HVMoveCamera() { x = Input.GetAxis("Mouse X") * movingSpeed; y = Input.GetAxis("Mouse Y") * movingSpeed; rotation = Quaternion.Euler(0, transform.rotation.eulerAngles.y, 0); transform.position = rotation * new Vector3(x, 0, y) + transform.position; } //模拟单击事件 public void TranslateCamera(Vector3 cen) { x = cen.x; y = cen.y; y = ClampAngle(y, yMinLimit, yMaxLimit); var rotation = Quaternion.Euler(y, x, 0); var position = rotation * new Vector3(0.0f, 0.0f, -normalDistance) + Center; if (needDamping) { transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * damping); transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * damping); } else { transform.rotation = rotation; transform.position = position; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构