You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现运行时通过点击拖拽鼠标旋转带铰链的立方体?

如何实现运行时通过点击拖拽鼠标旋转带铰链的立方体?

嘿,我来帮你搞定这个需求!要实现运行时通过拖拽鼠标旋转带铰链的立方体,核心是结合射线检测选中目标物体,再根据鼠标移动的偏移量来驱动铰链关节的旋转,下面是一步步的实现方案:

前期准备

  • 给你的立方体添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 06:39:29