【问题标题】:Unity — How to set a GameObject to an Available Object through Script?Unity——如何通过脚本将游戏对象设置为可用对象?
【发布时间】:2022-01-07 00:39:33
【问题描述】:

我是 Unity 开发的初学者。我正在尝试使用脚本设置游戏对象,而不是通过检查器。这就是我的意思。不要像这样设置游戏对象,而是将 Propeller 公开并手动设置:

我想直接从我的脚本中设置 Propeller。我该怎么做?

【问题讨论】:

标签: c# unity3d


【解决方案1】:

如果游戏对象是预制件...

...您可以使用Resources.Load("prefab path")。为此,您必须在 Assets 中创建一个 Resources 目录并将预制件放入其中。

如果它是场景中的游戏对象,您有多种选择。

所有这些都很慢,只应在Awake()Start() 中调用一次,并缓存在成员变量中。

1) GameObject.Find()

您可以在层次结构中输入游戏对象的路径并获取它。

但是,您正在对路径进行硬编码。当对象名称或对象名称发生更改时,您将不得不更改代码。不理想。

2) Transform.Find()

GameObject.Find() 不同,这不是静态方法。因此,您将从搜索对象的 Transform 中调用它:transform.Find()

我不怀疑这也是一个缓慢的函数,但它应该比以前的方法更快,因为它只在对象的子对象内部搜索。它也存在与GameObject.Find() 相同的“硬编码”问题。

请记住,它不是递归的;它不会在其子项的子项中进行搜索。

3) Component.GetComponent[s]InChildren()

最后,如果您要搜索的游戏对象具有特定于它的组件,您可以使用GetComponentInChildren<YourComponent>() 搜索它。它将返回组件的第一次出现。

如果您有多个这样的孩子,您可以将“组件”部分设为复数:GetComponentsInChildren<YourComponent>()。这将返回一个数组,其中包含子项中的每个此类组件。

然后您可以通过输入returnedComponent.gameObject 来访问他们的游戏对象。


但是,我强烈建议您在检查器中简单地拖动对象,除非您有充分的理由不这样做。这是 Unity 内置的依赖注入方式。您的脚本不必担心获取数据;只处理它。

【讨论】:

  • 最后的评论是这里的重要部分! Unity 以这种方式工作的原因是因为它管理场景中加载的内容,而不是在游戏开始时加载所有内容,并在您处理项目时保持更新。
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2022-10-11
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多