如何实现运行时通过点击拖拽鼠标旋转带铰链的立方体?
如何实现运行时通过点击拖拽鼠标旋转带铰链的立方体?
嘿,我来帮你搞定这个需求!要实现运行时通过拖拽鼠标旋转带铰链的立方体,核心是结合射线检测选中目标物体,再根据鼠标移动的偏移量来驱动铰链关节的旋转,下面是一步步的实现方案:
前期准备
- 给你的立方体添加
HingeJoint组件,在Inspector里设置好铰链的旋转轴(比如绕Y轴旋转),同时记得给立方体加上碰撞体(比如BoxCollider),不然射线检测没法命中它。 - 调整
HingeJoint的Limits参数,设置你想要的旋转范围(比如最小-90度、最大90度),避免立方体转得太离谱;还要开启Position Drive,调大一点Spring和Damper的值,让旋转更顺滑。
完整实现代码
把下面的脚本挂在任意空物体上,然后在Inspector里把带铰链的立方体拖到targetHinge字段里:
using UnityEngine; public class DoorDragController : MonoBehaviour { // 拖拽目标:带铰链关节的立方体 public HingeJoint targetHinge; // 鼠标灵敏度,数值越大旋转越快 public float mouseSensitivity = 2f; private bool isDragging = false; private float initialMouseX; private float initialHingeAngle; private void Update() { // 鼠标左键按下时,检测是否点击到目标立方体 if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) { // 确认点击的是我们的目标铰链物体 if (hit.collider.gameObject == targetHinge.gameObject) { isDragging = true; // 记录初始状态:鼠标位置和当前铰链角度 initialMouseX = Input.mousePosition.x; initialHingeAngle = targetHinge.angle; } } } // 鼠标左键抬起,结束拖拽状态 if (Input.GetMouseButtonUp(0)) { isDragging = false; } // 拖拽过程中实时更新铰链角度 if (isDragging) { // 计算鼠标X方向的移动偏移量 float mouseDeltaX = Input.mousePosition.x - initialMouseX; // 转换成铰链的目标角度 float newAngle = initialHingeAngle + mouseDeltaX * mouseSensitivity; // 用铰链的限制参数约束角度,避免超出范围 JointLimits limits = targetHinge.limits; newAngle = Mathf.Clamp(newAngle, limits.min, limits.max); // 更新铰链的驱动目标位置 JointDrive drive = targetHinge.drive; drive.targetPosition = newAngle; targetHinge.drive = drive; } } }
关键逻辑说明
- 射线检测:通过
Camera.main.ScreenPointToRay把鼠标位置转换成射线,判断是否点击到目标立方体,确保只有选中目标才触发拖拽。 - 拖拽状态管理:用
isDragging标记是否处于拖拽状态,记录初始的鼠标位置和铰链角度,避免拖拽时出现跳变。 - 角度计算:把鼠标X轴的移动量转换成铰链的角度变化,通过
mouseSensitivity控制旋转速度,再用Mathf.Clamp限制在铰链的允许范围内。 - 铰链驱动:通过修改
JointDrive的targetPosition来让铰链旋转到目标角度,依赖之前设置的Spring和Damper参数实现顺滑的旋转效果。
注意事项
- 确保你的主相机有
MainCamera标签,否则Camera.main会找不到相机导致报错。 - 如果想要支持垂直方向(Y轴)的拖拽旋转,只需要把代码里的
Input.mousePosition.x改成Input.mousePosition.y,同时调整铰链的旋转轴即可。
备注:内容来源于stack exchange,提问作者Axay Gadhiya
相关产品推荐
相关产品推荐

