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

Unity摄像机鼠标右键旋转功能

Unity摄像机鼠标右键旋转功能

实现功能

  1. 鼠标右键拖动旋转摄像机
  2. 支持水平(Y轴)和垂直(X轴)旋转
  3. 可调节的旋转速度
  4. 垂直旋转角度限制,防止视角翻转
  5. 平滑旋转效果
  6. 惯性旋转,拖动后释放鼠标仍有平滑过渡`

代码如下

using UnityEngine;/// <summary>
/// 摄像机旋转控制器 - 通过鼠标右键拖动实现摄像机旋转
/// </summary>
public class CameraRotation : MonoBehaviour
{[Header("旋转目标设置")][Tooltip("摄像机将围绕此目标点旋转")]public Transform target;[Tooltip("目标点与摄像机的初始距离")]public float distance = 5.0f;[Header("旋转参数")][Tooltip("旋转速度系数")]public float rotationSpeed = 2.0f;[Tooltip("垂直旋转最小角度限制")]public float verticalClampMin = -80f;[Tooltip("垂直旋转最大角度限制")]public float verticalClampMax = 80f;[Header("平滑旋转设置")][Tooltip("是否启用平滑旋转")]public bool useSmoothRotation = true;[Tooltip("平滑旋转时间")]public float smoothTime = 0.1f;[Header("惯性设置")][Tooltip("是否启用惯性旋转")]public bool useInertia = true;[Tooltip("惯性衰减因子")]public float inertiaFactor = 0.8f;[Tooltip("惯性停止阈值")]public float inertiaThreshold = 0.1f;[Header("键盘控制")][Tooltip("重置视角的按键")]public KeyCode resetKey = KeyCode.R;// 当前旋转角度private Vector2 currentRotation;// 目标旋转角度private Vector2 targetRotation;// 旋转速度(用于平滑旋转)private Vector2 rotationVelocity;// 惯性速度private Vector2 inertiaVelocity;// 是否正在旋转private bool isRotating;// 上一帧鼠标位置private Vector3 lastMousePosition;// 初始旋转角度private Vector2 initialRotation;void Start(){// 初始化目标点(如果未指定)if (target == null){CreateDefaultTarget();}// 初始化旋转InitializeRotation();}void Update(){// 处理输入HandleInput();// 更新旋转UpdateRotation();}/// <summary>/// 创建默认的目标点/// </summary>private void CreateDefaultTarget(){GameObject targetObj = new GameObject("CameraTarget");targetObj.transform.position = transform.position + transform.forward * distance;target = targetObj.transform;}/// <summary>/// 初始化旋转角度/// </summary>private void InitializeRotation(){// 计算初始旋转角度Vector3 direction = target.position - transform.position;Quaternion rotation = Quaternion.LookRotation(direction);initialRotation.x = rotation.eulerAngles.x;initialRotation.y = rotation.eulerAngles.y;currentRotation = initialRotation;targetRotation = initialRotation;}/// <summary>/// 处理用户输入/// </summary>private void HandleInput(){// 鼠标右键按下if (Input.GetMouseButtonDown(1)){StartRotation();}// 鼠标右键抬起else if (Input.GetMouseButtonUp(1)){StopRotation();}// 正在旋转时处理鼠标移动if (isRotating){ProcessMouseMovement();}// 处理惯性旋转else if (useInertia){ProcessInertia();}// 处理视角重置if (Input.GetKeyDown(resetKey)){ResetView();}}/// <summary>/// 开始旋转/// </summary>private void StartRotation(){isRotating = true;lastMousePosition = Input.mousePosition;inertiaVelocity = Vector2.zero;}/// <summary>/// 停止旋转/// </summary>private void StopRotation(){isRotating = false;}/// <summary>/// 处理鼠标移动/// </summary>private void ProcessMouseMovement(){// 计算鼠标移动距离Vector3 deltaMouse = Input.mousePosition - lastMousePosition;lastMousePosition = Input.mousePosition;// 更新目标旋转角度targetRotation.y += deltaMouse.x * rotationSpeed * Time.deltaTime;targetRotation.x -= deltaMouse.y * rotationSpeed * Time.deltaTime;// 限制垂直旋转角度targetRotation.x = Mathf.Clamp(targetRotation.x, verticalClampMin, verticalClampMax);// 记录惯性速度if (useInertia){inertiaVelocity = new Vector2(-deltaMouse.y, deltaMouse.x) * rotationSpeed;}}/// <summary>/// 处理惯性旋转/// </summary>private void ProcessInertia(){if (inertiaVelocity.magnitude > inertiaThreshold){// 根据惯性更新目标旋转角度targetRotation.y += inertiaVelocity.y * Time.deltaTime;targetRotation.x += inertiaVelocity.x * Time.deltaTime;// 限制垂直旋转角度targetRotation.x = Mathf.Clamp(targetRotation.x, verticalClampMin, verticalClampMax);// 衰减惯性inertiaVelocity *= inertiaFactor;}else{// 惯性小于阈值时停止inertiaVelocity = Vector2.zero;}}/// <summary>/// 更新摄像机旋转/// </summary>private void UpdateRotation(){if (useSmoothRotation){// 平滑旋转currentRotation = Vector2.SmoothDamp(currentRotation, targetRotation, ref rotationVelocity, smoothTime);}else{// 直接旋转currentRotation = targetRotation;}// 应用旋转ApplyRotation();}/// <summary>/// 应用旋转到摄像机/// </summary>private void ApplyRotation(){// 计算摄像机位置transform.position = target.position;transform.rotation = Quaternion.Euler(currentRotation.x, currentRotation.y, 0f);transform.position -= transform.forward * distance;}/// <summary>/// 重置视角到初始状态/// </summary>public void ResetView(){targetRotation = initialRotation;inertiaVelocity = Vector2.zero;}/// <summary>/// 绘制Gizmos/// </summary>void OnDrawGizmosSelected(){if (target != null){// 绘制目标点Gizmos.color = Color.yellow;Gizmos.DrawSphere(target.position, 0.1f);// 绘制摄像机到目标点的连线Gizmos.color = Color.cyan;Gizmos.DrawLine(transform.position, target.position);}}
}
http://www.dtcms.com/a/572595.html

相关文章:

  • Spring AI Alibaba文生图实战:从零开始编写AI图片生成Demo
  • 文本编辑器做网站国外设计师
  • 网站多久电子信息工程就业方向
  • 大连网站seo顾问企业开发网站公司
  • 南京网站设计搭建公司网站怎么做rss
  • 外包做网站谷歌seo优化
  • 博物馆网站 建设方案外贸短视频营销
  • 网站如何在360做提交微信开发公司怎么样
  • 广州微网站建设信息设计图案大全
  • 苏州吴中区专业做网站郑州哪里可以做网站
  • cms网站开发毕设简述网站建设的方法
  • 怎样建立网站挣钱网站建设功能选择表
  • 郑州加盟做网站开源程序网站
  • 万维网网站注册网站线下推广怎么做
  • 郑州 网站建设:网站开发页面大小适应屏幕
  • 网络营销网站建设知识南通关键词优化软件
  • 公司网站页脚dedecms手机网站模板
  • 团购网站建设公司深圳营销型网页设计公司
  • 东莞网站建设在哪里wordpress 加载中动画
  • 慈溪市建设局网站h5免费制作平台火蚁
  • 平凉北京网站建设百度店铺免费入驻
  • wordpress termmeta怎么把网站排名优化
  • 服装企业网站内容规划企业网站建设方案教程
  • 网站建设步骤和流程ico wordpress
  • 现在有什么网站可以做兼职的微信小程序开发大赛
  • 化妆品网站建设描述wordpress 导航不可点击
  • 友汇网站建设一般多少钱wordpress百度主动插件
  • 济南公司网站建设公司哪家好网站建设 中软
  • 如何设计一个网站没灵感做餐饮要看的网站
  • 做ic比较有名的网站wordpress文章字号