using System.Collections;
using System.Collections.Generic;
public class IsolatedDragMove : MonoBehaviour
private Rigidbody rb; // 当前物体的刚体组件
private Camera mainCamera; // 主摄像机引用
private bool isDragging = false; // 拖拽状态标识
private Vector3 offset; // 鼠标点击点与物体中心的偏移量
private float originalDrag; // 原始线性阻力值(用于恢复)
private float originalAngularDrag; // 原始角阻力值(用于恢复)
private bool originalUseGravity; // 原始重力状态(用于恢复)
private RigidbodyConstraints originalConstraints; // 原始刚体约束(用于恢复)
rb = GetComponent<Rigidbody>(); // 初始化刚体组件
mainCamera = Camera.main; // 获取场景中的主摄像机
originalDrag = rb.drag; // 存储默认线性阻力
originalAngularDrag = rb.angularDrag; // 存储默认角阻力
originalUseGravity = rb.useGravity; // 存储默认重力状态
originalConstraints = rb.constraints; // 存储默认约束状态
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition); // 创建从摄像机到鼠标位置的射线
if (Physics.Raycast(ray, out RaycastHit hit))
offset = - rb.position; // 计算偏移量 = 点击点坐标 - 物体中心坐标 isDragging = true; // 设置拖拽状态为,可拖拽
rb.useGravity = false; // 禁用物体重力以防止物体自然下落
= 10; // 设置高线性阻力(降低拖拽时的惯性抖动) rb.angularDrag = 10; // 高角阻力抑制旋转
rb.constraints = RigidbodyConstraints.FreezeRotation; // 冻结所有旋转轴
isDragging = false; // 结束拖拽状态
rb.useGravity = originalUseGravity; // 恢复原始重力状态
= originalDrag; // 恢复原始线性阻力 rb.angularDrag = originalAngularDrag; // 恢复原始角阻力
rb.constraints = originalConstraints; // 解除旋转冻结
if (isDragging) // 拖拽状态下运行
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition); // 创建从摄像机到鼠标位置的射线
Plane dragPlane = new Plane(-mainCamera.transform.forward, rb.position + offset); // 创建拖拽平面
if (dragPlane.Raycast(ray, out float enter)) // 检测射线与拖拽平面的交点
Vector3 targetPoint = ray.GetPoint(enter) - offset; // 计算目标点坐标(允许Y轴移动)
rb.velocity = (targetPoint - rb.position) * 20; // 计算速度向量:目标点-当前位置,乘以系数20