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;
}
}
答案 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
将为Single
和Pillar1
虽然我不明白为什么这不起作用,但我怀疑是内部错误。你确定这是你想要的吗(也许你只是想指定位置并忘记轮换(s。Instantiate)?如果你想要它然后尝试将实例化过程分成两个步骤:
pillar2.SetParent(Single)