关于Unity物品拖拽的问题求助
这个是相关代码,同时,分析天平上方玻璃罩设置了层级8,称量瓶设置了层级9
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class IsolatedDragMove : MonoBehaviour
{
#region DeepSeek二代拖拽代码实现
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; // 原始刚体约束(用于恢复)
 
void Start()
{
rb = GetComponent<Rigidbody>(); // 初始化刚体组件
mainCamera = Camera.main; // 获取场景中的主摄像机
 
// 保存物体的初始物理参数
originalDrag = rb.drag; // 存储默认线性阻力
originalAngularDrag = rb.angularDrag; // 存储默认角阻力
originalUseGravity = rb.useGravity; // 存储默认重力状态
originalConstraints = rb.constraints; // 存储默认约束状态
}
 
void OnMouseDown()
{
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition); // 创建从摄像机到鼠标位置的射线
 
// 射线检测获取碰撞点信息
if (Physics.Raycast(ray, out RaycastHit hit))
{
offset = hit.point - rb.position; // 计算偏移量 = 点击点坐标 - 物体中心坐标
}
 
isDragging = true; // 设置拖拽状态为,可拖拽
rb.useGravity = false; // 禁用物体重力以防止物体自然下落
rb.drag = 10; // 设置高线性阻力(降低拖拽时的惯性抖动)
rb.angularDrag = 10; // 高角阻力抑制旋转
rb.constraints = RigidbodyConstraints.FreezeRotation; // 冻结所有旋转轴
}
 
void OnMouseUp()
{
isDragging = false; // 结束拖拽状态
rb.useGravity = originalUseGravity; // 恢复原始重力状态
rb.drag = originalDrag; // 恢复原始线性阻力
rb.angularDrag = originalAngularDrag; // 恢复原始角阻力
rb.constraints = originalConstraints; // 解除旋转冻结
}
 
void FixedUpdate()
{
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
}
}
}
#endregion
}
2025-01-30
浏览393
登录后评论
1
分享