Unity3D/C#-什么';将预置实例化为游戏对象和组件类之间的区别是什么?

Unity3D/C#-什么';将预置实例化为游戏对象和组件类之间的区别是什么?,c#,unity3d,C#,Unity3d,假设我有一个名为Bullet的预置,附带了一个名为BulletControl.cs的脚本 我可以将其实例化为:GameObject bulletInstance=instantiate(Bullet,transform) 或者我可以这样做:BulletControl bulletInstance=实例化(Bullet,transform) 我最初认为实例化为GameObject只是一种更通用的类型,它允许您访问其他参数,如transform。根据我的理解,实例化与使用new关键字不同,因此我认为

假设我有一个名为
Bullet
的预置,附带了一个名为
BulletControl.cs
的脚本

我可以将其实例化为:
GameObject bulletInstance=instantiate(Bullet,transform)
或者我可以这样做:
BulletControl bulletInstance=实例化(Bullet,transform)

我最初认为实例化为
GameObject
只是一种更通用的类型,它允许您访问其他参数,如transform。根据我的理解,实例化与使用
new
关键字不同,因此我认为在声明bulletInstance的类型时,我并不是在创建BulletControl类的实例。这是怎么回事?

函数以参数作为参数

在Unity中,每个
游戏对象
和组件/脚本直接或间接继承自

假设脚本名为
YourScript

YourScript
继承自
monobhavior

public class YourScript : MonoBehaviour
{

}
public class MonoBehaviour : Behaviour
{

}
然后
monobhavior
继承自
behavior

public class YourScript : MonoBehaviour
{

}
public class MonoBehaviour : Behaviour
{

}
行为
继承自
组件

public class Behaviour : Component
{

}
最后,
组件
继承自
对象

public class Component : Object
{

}

对于
GameObject
,它直接从
Object
继承

public sealed class GameObject : Object
{

}
因此,从
对象
继承的任何类都应该能够用函数实例化

根据我的理解,实例化与使用new关键字不同


如果脚本不是从
monobhavior
继承的,那么可以使用
new
关键字创建它的新实例,就像普通的C#程序一样。如果它继承自
monobhavior
,则必须使用或函数。有关更多信息,请参阅帖子。

此外,在添加许多组件时,实例化比通过代码创建要快。至少,我们做的一个快速基准测试显示了这一点。可能是因为Unity提前知道预置需要什么,所以它可能会优化流程。待确认。“实例化比代码创建快”你能解释一下代码创建是什么意思吗?当你有GameObject obj=new GameObject(“名称”,typeof(SomeType),typeof(SomeOtherType));然后你有一个已经附加类型的预置,你使用实例化(预置),我们注意到它的速度大大加快了。这是在我们的情况下,但我不能为所有的情况下,所以这就是为什么我说要确认。哦,我明白了。我还没有真正做过那个测试,但那可能是真的。您提到的第一种方法似乎是大量使用反射。另外,它将字符串作为游戏对象名称的参数。该字符串可能导致内存分配,就像
GameObject.tag
。也许这就是原因。