Unity PC装机游戏主板吸附旋转异常问题求助
修正PC装机游戏主板吸附脚本问题
问题根源分析
- 旋转计算逻辑错误:原脚本中
transform.rotation * Quaternion.Inverse(offset2)的旋转计算逻辑错误,导致主板朝向异常。 - 直接修改Transform引发穿透:直接赋值
Ram.transform.position会绕过Unity物理引擎,忽略碰撞体检测,导致主板穿透机箱。 - 吸附逻辑重复触发:原脚本每帧都会强制设置位置和旋转,容易引发物理异常。
- 碰撞体配置缺失:若主板的Mesh Collider未勾选
Convex,带Rigidbody的物体无法正常进行物理交互,也会导致穿透。
修正后的脚本
using UnityEngine; public class RamSnap : MonoBehaviour { public GameObject Ram; // 主板相对于机箱本地空间的位置偏移 public Vector3 localOffset = new Vector3(0.053f, 3.3f, 0.3f); // 主板相对于机箱本地空间的旋转偏移 public Vector3 localRotationOffset = new Vector3(0, 0, 0); public float snapDistance = 10.0f; private bool isSnapped = false; private Rigidbody ramRb; void Start() { if (Ram != null) { ramRb = Ram.GetComponent<Rigidbody>(); } } void Update() { if (Ram == null || ramRb == null || isSnapped) return; float dist = Vector3.Distance(Ram.transform.position, transform.position); if (dist < snapDistance) { // 将本地空间偏移转换为世界空间坐标 Vector3 targetPosition = transform.TransformPoint(localOffset); // 将本地旋转偏移转换为世界空间旋转 Quaternion targetRotation = transform.rotation * Quaternion.Euler(localRotationOffset); // 通过Rigidbody方法更新位置和旋转,让物理引擎处理碰撞 ramRb.MovePosition(targetPosition); ramRb.MoveRotation(targetRotation); ramRb.isKinematic = true; isSnapped = true; Debug.Log("主板已吸附到机箱"); } } }
关键修正说明
- 使用
Transform.TransformPoint将本地空间偏移转为世界空间位置,确保机箱移动或旋转时,主板吸附位置能正确跟随。 - 添加
isSnapped标记位,限制吸附逻辑仅执行一次,避免重复强制修改引发的异常。 - 提前获取
Rigidbody组件,避免每帧调用GetComponent的性能损耗。 - 检查主板的Mesh Collider,必须勾选
Convex选项;若模型复杂,建议替换为多个Box Collider,提升物理交互稳定性。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

