当前位置: 首页 > backend >正文

unity中的交互控制脚本

使用方法: 挂载到要控制的相机上
target 选定围绕中心物体

using UnityEngine;public class OrbitCameraController : MonoBehaviour
{public Transform target; // 目标物体的Transformpublic float distance = 10.0f; // 初始相机到目标的距离public float xSpeed = 250.0f;public float ySpeed = 100.0f;[Range(1.0f, 100.0f)]public float minDistance = 2.0f; // 最小距离[Range(1.0f, 100.0f)]public float maxDistance = 40.0f; // 最大距离[Range(-90, 90)]                    // 控制俯仰角范围 [-90, 90]public float minYAngle = -60f;      // 最小俯仰角(向下看)[Range(-90, 90)]public float maxYAngle = 60f;       // 最大俯仰角(向上看)// 阻尼设置public bool useDamping = true;public float dampingTime = 0.15f;private float x = 0.0f;private float y = 0.0f;private float targetX = 0.0f;private float targetY = 0.0f;private float targetDistance;private Vector3 velocity = Vector3.zero;void Start(){Vector3 angles = transform.eulerAngles;x = angles.y;y = ClampAngle(angles.x, -360, 360);targetX = x;targetY = y;targetDistance = distance;//Cursor.lockState = CursorLockMode.Locked;}void LateUpdate(){if (!target) return;// 处理鼠标拖动视角HandleMouseRotation();// 处理鼠标滚轮缩放HandleScrollWheelZoom();// 处理触控缩放HandleTouchInput();// 应用阻尼效果if (useDamping){x = Mathf.SmoothDamp(x, targetX, ref velocity.x, dampingTime);y = Mathf.SmoothDamp(y, targetY, ref velocity.y, dampingTime);distance = Mathf.SmoothDamp(distance, targetDistance, ref velocity.z, dampingTime);}else{x = targetX;y = targetY;distance = targetDistance;}// 计算相机位置与旋转Quaternion rotation = Quaternion.Euler(y, x, 0);Vector3 position = rotation * new Vector3(0, 0, -distance) + target.position;transform.rotation = rotation;transform.position = position;}void HandleMouseRotation(){if (Input.GetMouseButton(0)) // 鼠标左键拖动旋转{targetX += Input.GetAxis("Mouse X") * xSpeed * Time.deltaTime * 0.5f;targetY -= Input.GetAxis("Mouse Y") * ySpeed * Time.deltaTime * 0.5f;targetY = Mathf.Clamp(targetY, minYAngle, maxYAngle); // 限制上下角度}}void HandleScrollWheelZoom(){float scroll = Input.GetAxis("Mouse ScrollWheel");if (scroll != 0){targetDistance -= scroll * 2f; // 滚轮灵敏度targetDistance = Mathf.Clamp(targetDistance, minDistance, maxDistance);UnityEngine.Debug.Log("相机距离: " + targetDistance);}}void HandleTouchInput(){if (Input.touchCount == 2){Touch touchZero = Input.GetTouch(0);Touch touchOne = Input.GetTouch(1);Vector2 touchZeroPrevPos = touchZero.position - touchZero.deltaPosition;Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition;float prevMagnitude = (touchZeroPrevPos - touchOnePrevPos).magnitude;float currentMagnitude = (touchZero.position - touchOne.position).magnitude;float difference = currentMagnitude - prevMagnitude;float scaleFactor = difference * 0.01f;targetDistance -= scaleFactor;targetDistance = Mathf.Clamp(targetDistance, minDistance, maxDistance);}}static float ClampAngle(float angle, float min, float max){if (angle < -360F)angle += 360F;if (angle > 360F)angle -= 360F;return Mathf.Clamp(angle, min, max);}
}
http://www.xdnf.cn/news/19807.html

相关文章:

  • 云手机将要面临的挑战有哪些?
  • 【学习记录】github私人仓库创建和本地克隆
  • CSS 伪类与伪元素:深度解析
  • 从零构建Linux Shell解释器深入理解Bash进程创建机制
  • 【Spring Cloud微服务】11.微服务通信演义:从飞鸽传书到5G全息,一部消息中间件的进化史诗
  • Java项目打包成EXE全攻略​
  • Ubuntu22.04下编译googletest源代码生成.so动态库
  • 利用 openssl api 实现 TLS 双向认证
  • MySQL-MVCC多版本并发控制详解
  • LangChain实战(十二):自定义Tools扩展Agent能力
  • Python+DRVT 从外部调用 Revit:批量创建门
  • Streamable HTTP
  • sv中forever如何结束
  • AI 在金融、医疗、教育、制造业等领域有着广泛的应用,以下是这些领域的一些落地案例
  • STM32HAL 快速入门(十七):UART 硬件结构 —— 从寄存器到数据收发流程
  • 告别剪辑烦恼!3个超实用技巧,让你的视频瞬间高级起来
  • 【音视频】视频秒播优化实践
  • UnityWebRequest 数据获取和提交
  • wpf 只能输入int类型的文本框
  • WebSocket客户端库:websocket-fruge365
  • Ubuntu下把 SD 卡格式化为 FAT32
  • Hostol Magento电商服务器套餐:基于阿里云,预配置高性能环境,一键开店
  • 如何用java给局域网的电脑发送开机数据包
  • B样条曲线,已知曲线上的某个点到起点的距离,确定这个点的参数u的值的方法
  • 新手向:破解VMware迁移难题
  • MP4视频太大如何压缩?分享6种简单便捷的压缩小技巧
  • websocket用于控制在当前页只允许一个用户进行操作,其他用户等待
  • 硬件(一)51单片机
  • 阿里开源首个图像生成基础模型——Qwen-Image本地部署教程,中文渲染能力刷新SOTA
  • HTTP 协议核心组件与安全扩展深度解析