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

Unity PC装机游戏主板吸附旋转异常问题求助

修正PC装机游戏主板吸附脚本问题

问题根源分析

  1. 旋转计算逻辑错误:原脚本中transform.rotation * Quaternion.Inverse(offset2)的旋转计算逻辑错误,导致主板朝向异常。
  2. 直接修改Transform引发穿透:直接赋值Ram.transform.position会绕过Unity物理引擎,忽略碰撞体检测,导致主板穿透机箱。
  3. 吸附逻辑重复触发:原脚本每帧都会强制设置位置和旋转,容易引发物理异常。
  4. 碰撞体配置缺失:若主板的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:26:19