实例化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;
}
}

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是预制,而不是场景中的实际对象。同样,变换是确定场景中对象的位置,旋转和比例的组件。根据Unity3D,由于Single是预制,因此使用其转换组件直接被禁用以防止数据损坏。这就是为什么我们在上述第1点中使用语句时会出现错误的原因。

,但我们可以使用存储在预制键转换组件中的位置,旋转和比例数据。这使我们可以在上面的第2点中使用该语句。

您无法在类型'转换'的引用中调用销毁。错误是您需要将GameObject传递到销毁方法而不是转换的错误。

我猜测代码"销毁"一个转换的一部分,但是无论如何,我的猜测是这样的:

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

错误表明已经有一个对象柱子1,因此我们假设它是随后拨打PlatformCreate的调用之一。

呼叫Instantiate包括所有孩子。因此,您将Single克隆到Pillar1,然后将新游戏对象重新定位为Single。在下一个通话中,两个都被克隆了。因此Pillar2将是SinglePillar1

尽管我不明白为什么不起作用,但我怀疑内部错误。您确定这是您想要的(也许您只想指定位置而忘记旋转(s。实例化(?如果是您想要的,然后尝试将实例化过程分为2个步骤:

  1. 无父母规格的致电实例化
  2. pillar2.SetParent(Single)

最新更新