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

Unity克隆对象设置父物体后立即自动解除父级关系故障排查

问题原因及修复方案

核心原因

问题出在代码执行顺序和Unity物理系统的默认规则冲突:

Unity 物理系统会强制所有非运动学(isKinematic = false)的Rigidbody对象保持在场景根节点层级。只要对象携带非运动学Rigidbody,任何设置父级的操作都会在物理帧更新时被自动覆盖,这也是你手动拖拽修改父级也会立刻回弹的根本原因。

你当前的代码执行顺序存在时序问题:

  1. 生成克隆体时直接指定父级 → 此时克隆体的Rigidbody继承原对象属性,isKinematic = false
  2. 执行销毁碰撞体的操作
  3. 才将Rigidbody设置为isKinematic = true
    在第一步和第三步的间隙,物理系统已经完成了一次帧更新,直接清空了你刚设置的父级,将克隆体挪回根节点。

修复方案

优先调整代码执行顺序即可解决,无需修改其他逻辑:

  • 不要在Instantiate方法中直接传入父级参数,先将克隆体生成到根节点,立刻设置isKinematic = true,再执行设置父级的操作,修改后代码如下:
private void OnTriggerEnter(Collider other)
{
    if (burgerGameManager.gameElement.Contains(other.gameObject.tag)) {
        burgerGameManager.addToPlayerOrder(other.gameObject);
        other.gameObject.SetActive(false);

        Vector3 position;
        if (transform.childCount > 1) {
            Transform lastChild = transform.GetChild(transform.childCount - 1);
            position = lastChild.position;
        } else {
            position = plate.transform.position;
            position.y = position.y + plate.GetComponent<MeshRenderer>().bounds.size.y;
        }

        // 先不指定父级,生成到根节点
        spawnClone = Instantiate(other.gameObject, position, other.gameObject.transform.rotation) as GameObject;
        Destroy(spawnClone.GetComponent<Collider>());
        // 先设置为运动学,物理系统不再干预层级
        spawnClone.GetComponent<Rigidbody>().isKinematic = true;
        // 再设置父级
        spawnClone.transform.SetParent(plate.transform);
        spawnClone.SetActive(true);
    }
}
  • 若调整后仍有问题,检查两个额外要点:
    • 确认克隆的原对象上没有在OnEnable、Start生命周期方法中修改transform.parent的逻辑
    • 确认plate对象本身没有挂载动态修改子物体层级的相关脚本

内容的提问来源于stack exchange,提问作者philman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:57:02