实例化在场景根中创建游戏对象的多个(不需要的)副本

时间:2017-08-22 10:54:39

标签: c# unity3d unity5

我有一个GameObject.Instantiate()方法可以创建一个Page游戏对象。然后Page游戏对象有一个Start()方法,它还会实例化一些新的游戏对象。

我的问题是在Start()方法中创建的游戏对象会被创建两次。首先它被创建为Page游戏对象的孩子(我想要的,这是正确的),但它也会在场景的根目录中创建相同的游戏对象。

我已尝试将Debug.Log("Calling start method...")添加到Start()以查看该方法是否被调用两次,但似乎并非如此。 将文本输出两次到日志。

Navigation.cs

void navigateTo(Page page) {
    ...
    // Here we instantiate the Page.
    this.currentPage = GameObject.Instantiate (page.gameObject, this.content.transform).GetComponent<Page>();
}

Page.cs

void Start () {
    // Here we create a child GameObject. This get's created both as a child of 
    // the Page game object, but also in the root of the scene.
    GameObject tableGO = new GameObject ("Table");
    GameObject instance = GameObject.Instantiate(tableGO, this.gameObject.transform) as GameObject;
    ...
}

1 个答案:

答案 0 :(得分:0)

问题是new GameObject ("Table")创建了一个没有父级的游戏对象,GameObject.Instantiate(tableGO, this.gameObject.transform) as GameObject;也创建了一个游戏对象,但在第二种情况下,你使用第一个游戏对象作为模板(或者像预制件)并设置了一个它的父母。因此,您可以删除GameObject tableGO = new GameObject ("Table");并使用预制来创建游戏对象或移除第二行并将tableGO.transform.parent设置为您需要的任何内容。