【问题标题】:Unity: When parenting cloned object, it instantly unparentsUnity:当父母克隆对象时,它会立即取消父母
【发布时间】:2021-09-12 00:15:40
【问题描述】:

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

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);
    }
}

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

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

【问题讨论】:

  • 听起来其他一些代码正在影响育儿.. 我不明白为什么您的代码应该按照您描述的方式运行...
  • 你设置的父级被注释掉了。
  • @BugFinder 我已将父级设置为实例化方法中的第四个参数。

标签: c# unity3d


【解决方案1】:
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);

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

【讨论】:

  • 不幸的是仍然无法正常工作,但是是的,盘子应该是父级。
  • 您可以编辑您的帖子并显示与该行为相关的任何其他代码吗?我进行了快速测试,对我来说效果很好。从您的“它会立即(在播放时)再次摆脱它”。可能有一个函数正在删除父项
  • 我编辑了我的问题。如果还有什么不清楚的地方,请告诉我。感谢您的帮助!
  • AddToPlayerOrder 基本上只是将一些字符串添加到字典中,所以它不应该是原因。但至少我现在知道触发功能似乎不是问题。我想我会继续搜索。感谢您的支持!
  • 我相信你会解决的,祝你好运!
猜你喜欢
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
相关资源
最近更新 更多