实例化GameObject会导致所述对象的Transform被破坏?

时间:2017-05-04 10:41:24

标签: c# unity3d instantiation gameobject

Unity和C#的新手

这实际上只是一个我很好奇的小问题...我在调试此代码时尝试使其运行(尝试失败)。我一直试图让这段代码工作几个小时。

无论如何,当执行此代码时,只有一个错误,但它出现了3次。它说"不能破坏' Pillar1'的变换组件。如果你想破坏游戏对象,请致电' Destroy'而是在游戏对象上。不允许销毁转换组件。"

我第一次得到这个。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlatformGenerator : MonoBehaviour {

public GameObject Single;
private GameObject NewPillar;

private int PillarCount;
private bool run;

private int px;
private int py;
private int pz;

void Start () {

    px = 0;
    py = 0;
    pz = 0;

    bool run = true;
    PlatformCreate ();
}

void Update () {
    if (run) {
        PlatformCreate ();
        if (PillarCount == 3) {
            run = false;
        }
    }
}

void PlatformCreate () {
    PillarCount +=1;

    Single.transform.position = new Vector3 (px, py, pz);

    NewPillar = Instantiate (Single, Single.transform);
    NewPillar.name = "Pillar" +PillarCount;

    px += 2;
}
}

3 个答案:

答案 0 :(得分:2)

1)使用以下语句会导致意外结果或抛出错误 -

NewPillar = Instantiate (Single, Single.transform);

OR

NewPillar = Instantiate (Single);
NewPillar.transform.parent = Single.transform;

2)您可以使用以下代码绕过此 -

NewPillar = Instantiate (Single, Single.transform.position, Single.transform.rotation);

说明: Single是一个预制件,而不是场景中的实际对象。此外,transform是一个组件,用于确定场景中对象的位置,旋转和缩放。根据Unity3D,由于Single是预制件,因此直接使用它的变换组件会被禁用以防止数据损坏。这就是我们在上面第1点中使用语句时出错的原因。

但我们可以使用预制变换组件中存储的位置,旋转和缩放数据。这让我们可以使用上面第2点中的陈述。

答案 1 :(得分:1)

你不能在类型'变换'的引用上调用Destroy。错误在于你需要将GameObject传递给Destroy方法,而不是转换。

我猜测代码的一部分'正在摧毁'缺少变换,但无论如何,我的猜测是这样的:

    Destroy(transform); // -1

    Destroy(pillar1.transform); //Where pillar1 is a Gameobject -2

    Destroy(pillar1); // Where pillar1 is a Transform -3

替换

-1随着

    Destroy(gameObject);

-2随着

    Destroy(pillar1); //Where pillar1 is a Gameobject -2

-3随着

    Destroy(pillar1.gameObject);

答案 2 :(得分:0)

错误表明已经存在对象Pillar1,因此我们假设它是对PlatformCreate的后续调用之一。

Instantiate的电话包括所有儿童。因此,您将Single克隆到Pillar1并将新游戏对象重新显示为Single。在下一次调用中,它们都被克隆。因此Pillar2将为SinglePillar1

虽然我不明白为什么这不起作用,但我怀疑是内部错误。你确定这是你想要的吗(也许你只是想指定位置并忘记轮换(s。Instantiate)?如果你想要它然后尝试将实例化过程分成两个步骤:

  1. 在没有父规范的情况下调用实例化
  2. pillar2.SetParent(Single)