首页 > 解决方案 > Unity:当父母克隆对象时,它会立即取消父母

问题描述

我想使用以下代码克隆一个对象并将其设置为另一个对象的子对象:

spawnClone = Instantiate(other.gameObject, position, rotation, plate.transform) as GameObject;
Destroy(spawnClone.GetComponent<Collider>());
//spawnClone.transform.SetParent(plate.transform);
spawnClone.GetComponent<Rigidbody>().isKinematic = true;
spawnClone.SetActive(true);

不幸的是,父子关系不起作用,克隆的对象只是放置在场景的根部。如果我尝试将克隆对象移动到层次结构中的任何其他对象中,它就会立即再次脱离它(在播放时)。

有什么我做错了或者我没有看到吗?

提前致谢!

编辑:为了更好地理解

我有一个带有子对象(触发器)的游戏对象(盘子)。触发器有一个网格碰撞器(启用触发器)和一个脚本。该脚本具有以下 OnTriggerEnter-Method:

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, gameObject.transform) as GameObject;
        Destroy(spawnClone.GetComponent<Collider>());
        //spawnClone.transform.SetParent(plate.transform);
        spawnClone.GetComponent<Rigidbody>().isKinematic = true;
        spawnClone.SetActive(true);
    }
}

此方法应该在玩家将物体放在盘子上方时触发。该对象应该隐藏并生成它的克隆以出现在盘子上。

稍后,该脚本也应该附加到生成的克隆上,以便玩家可以在盘子上堆叠对象。但我还没有做到这一点,因为我什至没有迈出第一步,正如我们所看到的......

标签: c#unity3d

解决方案


spawnClone.transform.parent = plate.transform;

应该这样做,如果盘子应该是父母

编辑

我重新创建了您的代码,如下所示

public class Test : MonoBehaviour{
private void OnTriggerEnter2D(Collider2D other)
{
    Vector2 position;
    other.gameObject.SetActive(false);

    position = this.gameObject.transform.position;
    position.y += 0.5f;

    if (transform.childCount >= 1)
    {
        Transform lastChild = transform.GetChild(transform.childCount - 1);
        position = lastChild.transform.position;
        position.y += 0.5f;
    }

    GameObject spawnClone = Instantiate(other.gameObject, position, Quaternion.identity);
    Destroy(spawnClone.GetComponent<Collider2D>());
    spawnClone.GetComponent<Rigidbody2D>().isKinematic = true;
    spawnClone.transform.parent = this.gameObject.transform;
    spawnClone.SetActive(true);
}

}

我得到了这种行为,这就是我认为你想要的

样本

我在这里唯一的结论是

burgerGameManager.addToPlayerOrder(other.gameObject);

可能会影响育儿。也许尝试在函数末尾移动它,看看会发生什么?


推荐阅读