跳到主要内容
更新日期:

如何在Unity中创建子游戏对象

作者:

马特·伯德写了各种各样的废话,但他喜欢为Unity编写教程。

父母和儿童游戏机是在统一中编程游戏时要理解的重要概念。实际上,每场比赛都会依赖于父子互动的不断变化,从而了解这些互动做了什么 - 以及如何在第一位置形成它们 - 是一个新程序员的重要课程。本文将探讨儿童GameObjects的性质,以及如何创建它们。

什么是团结的孩子?

Unity是一个建立在有组织的层次结构上的程序,子对象是层次结构中的游戏对象。子对象包含在父对象中,受父对象的定位、旋转和缩放等因素的影响。一旦创建了子对象,该游戏对象在很大程度上由其父对象管理。

以下图拍照作为一个例子。有两个圆柱形游戏。在左侧的层次结构上,孩子列在父级下面。较大的气缸是父母,而较小的是孩子。

自己采取的屏幕截图。Unity Technologies拥有和开发的团结。

自己采取的屏幕截图。Unity Technologies拥有和开发的团结。

对父项所做的任何更改都将自动传递给子项。所以如果我们弄乱了一些设置。例如,旋转、缩放和位置。

. . .这些变化也会反映在孩子身上。当父组件被调整大小和重新定位时,子组件也会跟着调整——尽管它相对于父组件保持相同的位置。孩子基本上是父母的奴隶,影响父母的外部力量也会影响孩子。

父游戏对象可以有任意多的子对象。游戏中的每一个游戏对象都有可能是单亲游戏对象的子对象,而分支的父对象则从单亲游戏对象向下移动。孩子们也可以是他们自己的父母,可以随意向下移动层次结构的多个分支——不过请记住,每个孩子的游戏对象都会受到他们父母的变化的影响。如果父项被销毁或删除,则其下的每个子项也将被删除。

相比之下,父gameObjects不会在其子项中进行更改,并且您可以在不移动,重塑,重新划分或销毁其父的情况下操作子对象。

父母和孩子如何统一?

统一的孩子和父动力有很多用途。以下是一些更常见的:

  • 为了简单的组织目的。例如,如果您的游戏有一个UI,您可能会将该UI的所有元素堆叠在一起,以便于查找。这也有助于分离Unity的层次结构,因为您可以折叠子对象的列表。
  • 为了简单,大规模的变化。从最后一个例子中获取UI,假设您决定要使整个事情更大。或更小。或者也许你想把它转移到一下。或者在某些情况下可以完全禁用它。通过将所有UI的UI元素划入单个父级,您可以通过操纵父级而不是与个体子项搞乱来实现这些更改。
  • 将相关的对象放在一起。让我们假设你有一个带有可变装备的角色GameObject。当角色移动时,设备需要与角色保持一致,让每个GameObject都成为角色GameObject的子对象,这样当角色在屏幕上移动时,设备就会与角色保持相对关系。为了动画的目的,你还需要将游戏对象的子对象转换为父对象。
  • 用于从特定位置生成新对象。假设你的角色有一把可以发射子弹的枪。这些子弹需要从枪中产生,或者可能是从枪管末端的一个看不见的游戏物体中产生。将“繁殖点”子化为父角色将导致子弹从其指定的点飞出,而不是从屏幕上的某个随机点飞出。(但请记住,上述子弹应成为枪的孩子,因为他们会在角色移动的任何地方移动。)

除非你是在处理一款非常简单的游戏,否则你可能需要定期将GameObjects的子对象添加到父对象中。那么这是如何做到的呢?有几种不同的方法。

1.拖放

创建孩子的最简单方法是在屏幕左侧使用Unity的层次结构。单击GameObject并将其拖到另一个GameObject。执行此操作将创建分层层次结构,将拖动的对象转换为子项。小菜一碟。您可以继续将孩子添加到原始父母,或与您一样。将子组拖动到层次结构上的空白处将删除其子状态。

当然,这种方法在运行时是没有用的,这意味着进一步的儿童化需要对C#进行一点深入研究。

2.实例化为子对象

第二种生成游戏对象的方法需要一种称为实例化的通用统一方法。当您实例化一个游戏对象时,您正在游戏中创建它的一个实例,在本例中,将该实例作为现有父对象的子对象放置。

这一次,你想使用Instantiate()方法,并将父节点的Transform设置为父节点,如下所示:

在这里,我们有两个游戏对象-exampleParent(一个粉红色方块),已经在游戏中处于活动状态,exampleChild(一个蹲着的角色),可以在项目文件中找到-连接到一个不可见的游戏对象。当玩家点击J键时,游戏将在与exampleParent变换相同的坐标处实例化exampleChild游戏对象的副本。所以这个。

. . .成为这个。

每次在此示例中达到j键时,它将添加另一个实例的excepleChild,以便将作为一个孩子在实例调用的变换的准确中心。如果确切的中心是不可取的,您还可以抛入向量以更改孩子的初始坐标,如下所示:

因此,'+2'将exampleChild的新实例移动到示例索收的右侧。您可以为矢量中的其他数字添加类似的计算以进行不同的结果。(虽然您绝对不应该用于这些计算的原始数字。您可以在检查器中更改的变量是要走的方式。)

3.设定为儿童

最后一个方法假定要将现有对象转换为另一个对象的子子。这很好,简单。

您需要做的就是确保将在此方法和父母中首先出发。如果这是正确完成的,则第一个GameObject将在层次结构中的第二个中移位。(也可以使用类似的方法从GameObject中删除一个孩子,尽管这是另一个文章的更复杂的过程。)这是更改子对象的变换,但对父对象的任何后续更改都会影响子对象。

值得注意的是,在本例中,父子关系只在运行时持续。一旦你关闭游戏并回到Inspector那里,父母将不再有孩子。

关于儿童的重要说明

通常在Unity中,GameObject的变换反映了其世界的位置。如果将对象的x位置从0到1更改为1,因此,它将向右移动一点点。这是可预测的,通常在检查器中移动GameObjects时,您想要什么。

但是,当你将一个游戏对象变成一个子对象时,它在检查器中的状态会改变,反映出它的局部位置。“局部位置”使用对象的父对象来确定数字,而不是整个世界的数字。因此,例如,如果父对象的x坐标为2,而其子对象的x坐标为2,则它们将不在同一位置。

相反,孩子应该在父母的右边,两个单位之外。听起来很简单,但你会惊讶地发现,在处理孩子与父母和游戏世界其他部分的关系时,很容易混淆。在这方面,轮换尤其令人困惑。

在你孩子身上有坐标遇到麻烦吗?解决问题的最简单方法之一是从Inspector中从其父级删除该孩子。这将改变其变换值回到其世界位置,并为您提供更好的孩子在太空中的位置。使用父级外部的值并在您对结果满意时恢复配对。

就作者所知,本内容准确、真实,并不意味着取代合格专业人士的正式和个性化建议。

相关文章

Baidu