我现在正在使用c ++和c知识学习unity3d和c#。但是,我对这行代码感到困惑。
private Gameobject cubePrelab;
这是一条简单的代码行,根据讲师的说法,“定义了我们要生成的对象”。 然后他立即做类似的事情:
Instantiate(cubePreLab, ...,...)
根据在线文档克隆对象。 我对第一行代码感到困惑,似乎我们只是在定义一个对象而没有实际对其进行初始化。但是,结果是使用这两行代码,我们实际上可以在屏幕上创建一个框,但是我很困惑为什么它是框而不是三角形。
答案 0 :(得分:2)
我建议您阅读有关Unity Prefabs
由于您是Unity新手,所以我假设您是通过将一些对象(例如多维数据集)放入场景开始的,对吗?使用Unity Editor可以轻松地在设计游戏时将对象放入场景中,但是如果您想在玩游戏时将对象动态地添加到场景中怎么办?
例如,假设您创建了一个包含大炮的场景,并且每次玩家按下Space键时,您都想发射一个炮弹。在Unity编辑器中创建场景时,您将大炮放到了场景中,但是在玩游戏时如何添加炮弹?
您可能有很多代码,每次发射时都会从头开始创建炮弹,但这是一种非常耗时且容易出错的方式。这就是预制件的来源。预制件就像是要在以后添加到场景中的对象的蓝图。因此,炮弹预制件将是您在Unity编辑器中设计的对象,就像您要添加到场景中的任何其他Unity对象一样。您可以通过Unity编辑器(无需代码)分配其大小,材料,颜色,攻击力等。
首先,您将在Unity编辑器中为炮弹创建一个预制件。
创建炮弹预制件后,应在Cannon
类上添加一个属性,例如public GameObject cannonballPrefab
,然后将炮弹预制件从Unity编辑器中拖到“炮弹预制件”属性中Unity Inspector中cannon对象上的Cannonball组件的位置。 因此,如果仅查看C#代码,似乎cannonballPrefab
字段永远不会初始化。但是,您通过在Unity Editor中将预制件拖入其中来 对其进行初始化。为了参考您的最初问题,这也是Unity如何知道在示例中如何创建框而不是三角形的方法。 Unity将创建一个预制的实例。
然后在您的Cannon
代码中,每次要向场景中添加炮弹时,您可以实例化您的cannonballPrefab
实例。
现在,当您致电Instantiate(cannonballPrefab...
时,Unity会将炮弹实例添加到场景中。然后,您可能会通过为其分配初始位置,初始速度,初始方向等来进行一些其他初始化。
此外,就像Pac0所说的那样,本教程可能有public GameObject cubePrefab
(不是private
),因此您可以从Unity Editor中将引用拖入其中。另外,您可以将其保留为私有,并向其添加[SerializeField]
属性,如下所示。 Unity不允许您从编辑器分配private
字段,除非它具有[SerializeField]
属性。
[SerializeField]
private GameObject cubePrefab;