为什么我们必须使用GetComponent方法从脚本中访问组件?我们可以制作它的对象吗?
例如而不是
Rigidbody rb;
rb = GetComponent<Rigidbody>();
我们能用吗
Rigidbody rb = new Rigidbody();
并使用基于此的方法。结果会一样吗?
谢谢。
附言:我是统一的新手
否
对于您的用例,请参阅此答案的最后几行。;(
在Unity中使用new
创建Component
的实例是完全非法的您还会在控制台中收到有关它的警告。
出于某种愚蠢的原因,Unity仍然";允许";但这样做只会引发警告而不是异常。然而,这种情况不会";工作;因为大多数东西都不会被正确初始化。。该怎么办?没有与之相关的GameObject
,那么如果没有GameObject
,Rigidbody
有什么用?-对,这是绝对无用的;(
Component
只有连接到GameObject
才能正确存在。因此,只有三种有效的方法可以在运行时创建实例:
-
使用
GameObject
的构造函数,例如var obj = new GameObject("SomeName", typeof(Rigidbody)); var rb = obj.GetComponent<Rigidbody>();
这将创建一个名为
SomeName
的新游戏对象,其中仅附加了Transform
和Rigidbody
组件。 -
使用
Instantiate
克隆现有游戏对象或从预制中创建实例。[SerializeField] private Rigidbody prefab; ... var rb = Instantiate (prefab);
-
使用
AddComponent
将给定组件类型的新实例添加到现有的GameObject
中。构造函数中的示例也可以实现为var rb = new GameObject("SomeName").AddComponent<Rigidbody>();
或者在您的用例中将该组件添加到您的脚本附加到的同一对象中
var rb = gameObject.AddComponent<Rigidbody>();
这可能最接近你的代码试图做的