为什么我们在 Unity 中使用 GetComponent 方法来从我们的脚本访问其他组件,我们不能只制作这种类型的对象吗?



为什么我们必须使用GetComponent方法从脚本中访问组件?我们可以制作它的对象吗?

例如而不是

Rigidbody rb;
rb = GetComponent<Rigidbody>();

我们能用吗

Rigidbody rb = new Rigidbody();

并使用基于此的方法。结果会一样吗?

谢谢。

附言:我是统一的新手

对于您的用例,请参阅此答案的最后几行。;(

在Unity中使用new创建Component的实例是完全非法的您还会在控制台中收到有关它的警告。

出于某种愚蠢的原因,Unity仍然";允许";但这样做只会引发警告而不是异常。然而,这种情况不会";工作;因为大多数东西都不会被正确初始化。。该怎么办?没有与之相关的GameObject,那么如果没有GameObjectRigidbody有什么用?-对,这是绝对无用的;(

Component只有连接到GameObject才能正确存在。因此,只有三种有效的方法可以在运行时创建实例:

  • 使用GameObject的构造函数,例如

    var obj = new GameObject("SomeName", typeof(Rigidbody));
    var rb = obj.GetComponent<Rigidbody>();
    

    这将创建一个名为SomeName的新游戏对象,其中仅附加了TransformRigidbody组件。

  • 使用Instantiate克隆现有游戏对象或从预制中创建实例。

    [SerializeField] private Rigidbody prefab;
    ...
    var rb = Instantiate (prefab);
    
  • 使用AddComponent将给定组件类型的新实例添加到现有的GameObject中。构造函数中的示例也可以实现为

    var rb = new GameObject("SomeName").AddComponent<Rigidbody>();
    

    或者在您的用例中将该组件添加到您的脚本附加到的同一对象中

    var rb = gameObject.AddComponent<Rigidbody>();
    

    这可能最接近你的代码试图做的

相关内容

最新更新