[Unity3d]鼠标旋转缩放拖动模型

简介:

实现鼠标旋转拖动缩放模型,非常不错的代码:

using UnityEngine; using System.Collections;  public class MouseControl : MonoBehaviour {      //目标物体     public Transform target;     private int MouseWheelSensitivity = 1; //放大倍数的快慢     private int MouseZoomMin = 1; //最小倍数     private int MouseZoomMax = 5; //最大倍数     //默认距离     private float normalDistance = 3;       private Vector3 normalized;      //拖拽的移动速度     private float xSpeed = 250.0f;     private float ySpeed = 120.0f;      //拖拽的高度限制     private int yMinLimit = -20;     private int yMaxLimit = 80;      //角度     private float x = 0.0f;     private float y = 0.0f;          //记录目标物体的坐标     private Vector3 screenPoint;     private Vector3 offset;      //围绕x旋转30°     private Quaternion rotation = Quaternion.Euler(new Vector3(30f, 0f, 0f));      //目标的3D坐标     private Vector3 CameraTarget;      //打印欧拉角:绕各个轴旋转的角度,顺时针为正方向     public void Awake()     {         print(transform.eulerAngles.x);         print(transform.eulerAngles.y);         print(transform.eulerAngles.z);     }      void Start()     {         //找到目标飞机的3d坐标         CameraTarget = target.position;          //目标飞机的z-3,距离摄像机更近了         float z = target.transform.position.z - normalDistance;         //给当前相机给定位,现在的3D坐标乘以30°         transform.position = rotation * new Vector3(transform.position.x, transform.position.y, z);          //将视角转向物体         transform.LookAt(target);          //记录各个轴偏离的角度         var angles = transform.eulerAngles;         x = angles.y;         y = angles.x;     }      void OnGUI()     {         GUI.Label(new Rect(10,10,300,30),"左击:旋转;滚轮:缩放;中击:拖拽");     }      void Update()     {         //如果左击了,旋转         if (Input.GetMouseButton(0))         {             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) + CameraTarget;              transform.rotation = rotation;             transform.position = position;          }         //滚轮缩放         else if (Input.GetAxis("Mouse ScrollWheel") != 0)         {             //摄像机3d坐标-物体的3d坐标             normalized = (transform.position - CameraTarget).normalized;              if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax)             {                 normalDistance -= Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity;             }             if (normalDistance < MouseZoomMin)             {                 normalDistance = MouseZoomMin;             }             if (normalDistance > MouseZoomMax)             {                 normalDistance = MouseZoomMax;             }             //改变摄像机的远近             transform.position = normalized * normalDistance;         }         //案件按下 记录鼠标的         else if (Input.GetMouseButtonDown(2))         {             //将目标物体的坐标转化成平面坐标             screenPoint = Camera.main.WorldToScreenPoint(target.transform.position);             //计算鼠标的3维坐标跟物体的3维坐标的差值             offset = target.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));         }          //中键拖拽,改变飞机的坐标,每帧调用         if (Input.GetMouseButton(2))         {             //鼠标的平面坐标             Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);             //鼠标转移的3d空间坐标值             Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;             //改变鼠标的3D空间坐标             target.transform.position = curPosition;         }         //朝向,每动一帧都要改变朝向         transform.LookAt(CameraTarget);     }      //控制旋转的角度,如果旋转的角度大于360或者小于360都要加上或者减去对应的角度     static float ClampAngle(float angle, float min, float max)     {         if (angle < -360)             angle += 360;         if (angle > 360)             angle -= 360;         return Mathf.Clamp(angle, min, max);     } }























本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366366,如需转载请自行联系原作者

相关文章
|
10天前
|
图形学 开发者
unity 从工具栏拖动生成物体
在 Unity 中实现从工具栏拖动生成物体的功能,基于编辑器扩展、事件系统和预制体实例化。通过自定义编辑器窗口、处理鼠标事件(按下、移动、释放)及使用 Instantiate 方法,可实现拖动并生成预制体物体。代码示例展示了如何检测鼠标事件并在指定位置实例化物体。
|
10天前
|
图形学 开发者
unity 获取鼠标跟键盘
在 Unity 中,鼠标和键盘输入的获取依赖于底层操作系统的输入系统。操作系统捕获硬件事件(如鼠标的移动、点击及键盘按键),并将其转化为输入事件。Unity 通过 Input 类封装这些事件,使开发者能便捷地访问鼠标和键盘数据。例如,`Input.GetAxis` 方法用于获取鼠标滚轮、X/Y 轴移动及键盘方向键的输入,简化了开发流程。 代码示例展示了如何使用 `Input.GetAxis` 获取鼠标滚轮、左右和上下移动,以及键盘的方向键输入,并根据这些输入进行相应的处理和物体移动。
|
10天前
|
图形学
unity判断鼠标在不在UI上
在 Unity 中,判断鼠标是否在 UI 上主要依赖事件系统和射线检测机制。Unity 的事件系统负责处理输入事件,GraphicRaycaster 组件用于检测射线与 UI 元素的相交情况。通过 `EventSystem.current.IsPointerOverGameObject()` 方法可轻松判断鼠标是否在 UI 上。对于移动端,使用 `EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)` 来判断触摸是否在 UI 上。代码实现简单且高效。
|
11天前
|
算法 测试技术 vr&ar
Unity Vufoia+AR模型抖动的问题
**图像识别与跟踪精度问题**:Vuforia 依赖特征点检测,环境光线不稳定、目标纹理不丰富或遮挡会导致特征点匹配误差,引起AR模型抖动。跟踪丢失和重定位延迟也会导致模型不稳定。 **设备硬件与性能问题**:移动设备摄像头易受手持抖动影响,低性能设备无法及时处理图像数据,导致跟踪结果更新延迟。 **模型与坐标系问题**:AR模型重心设置不合理或坐标系转换误差,会使模型在虚拟空间中不稳定。 **算法与参数设置问题**:跟踪算法局限性和参数设置不合理(如灵敏度过高或平滑度过低)都会影响跟踪稳定性。 。
|
11天前
|
图形学
Unity UGUI实现鼠标拖动图片
在 Unity UGUI 中实现鼠标拖动图片功能,主要涉及事件检测、坐标转换和物体位置更新。根据鼠标移动量更新图片位置。代码示例展示了如何通过这些步骤实现拖动效果。
|
6月前
|
图形学
小功能⭐️Unity Button按钮实现鼠标移入移出触发相应事件
小功能⭐️Unity Button按钮实现鼠标移入移出触发相应事件
|
6月前
|
图形学
小功能⭐️Unity动态更换天空盒、旋转天空盒
小功能⭐️Unity动态更换天空盒、旋转天空盒
|
6月前
|
图形学
小功能⭐️不用传参,Unity获得鼠标悬浮处的物体、UI!
小功能⭐️不用传参,Unity获得鼠标悬浮处的物体、UI!
|
6月前
|
图形学
Unity精华☀️一、从旋转到万向锁之:Unity的旋转
Unity精华☀️一、从旋转到万向锁之:Unity的旋转
|
5月前
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
274 4