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

Instantiating a GameObject causes said object to have its Transform destroyed?

Unity 和 C# 新手

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

反正这段代码执行的时候只有1个错误,但是出现了3次。它说 "Can't destroy Transform component of 'Pillar1'. If you want to destroy the game object, please call 'Destroy' on the game object instead. Destroying the transform component is not allowed."

我第一次得到那个。

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

您不能对 'Transform' 类型的引用调用 Destroy。错误是说您需要将 GameObject 传递给 Destroy 方法,而不是 Transform。

我猜测代码 'destroying' 转换的部分丢失了,但无论如何,我的猜测是这样的:

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

错误表明已经有一个 object Pillar1,因此我们假设它是对 PlatformCreate.

的后续调用之一

Instantiate的调用包括所有children。因此,您将 Single 克隆到 Pillar1,然后将新游戏 object 重新 parent 到 Single。在下一次调用中,它们都被克隆。所以 Pillar2 将是 SinglePillar1

虽然我不明白为什么这不起作用,但我怀疑是内部错误。你确定这是你想要的吗(也许你只是想指定位置而忘记了旋转(s.Instantiate)?如果这是你想要的,那么尝试将 Instantiate 过程分成 2 个步骤:

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

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

NewPillar = Instantiate (Single, Single.transform);

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

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

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

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

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