C# Unity,实例化一个预置,要求它有一个特定的脚本

C# Unity,实例化一个预置,要求它有一个特定的脚本,c#,unity3d,C#,Unity3d,当我想实例化一个预置时,我会这样做: [SerializeField] private GameObject myPrefab; [...] var a = Instantiate(myPrefab) as GameObject; 然后,如果myPrefab有一个脚本MyScript,我可以访问它的方法或变量,如下所示: [SerializeField] private GameObject myPrefab; [...] var a = Instantiate(myPrefab) as Ga

当我想实例化一个预置时,我会这样做:

[SerializeField] private GameObject myPrefab;
[...]
var a = Instantiate(myPrefab) as GameObject;
然后,如果myPrefab有一个脚本MyScript,我可以访问它的方法或变量,如下所示:

[SerializeField] private GameObject myPrefab;
[...]
var a = Instantiate(myPrefab) as GameObject;
a.GetComponent().SomeMethod()

在第五章《行动中的统一》一书中,作者使用了不同的方法:

[SerializeField] private MyScript myScript;
[...]
var a = Instantiate(myScript) as MyScript;
a.SomeMethod();
据我所知,通过这种方式,我有一个较短的sintax来访问脚本的变量和方法,但我需要一个较长的sintax来访问包含的游戏对象。(我认为是这样的:a.getComponentParent())


除了这本书之外,我还没有找到关于这种实例化对象方法的文档,我想听听大家对这种方法的看法。

你可以从你的例子中看到,他实例化的是脚本本身,而不是所有的游戏对象,这样他就可以执行方法,而不需要引用执行它们的脚本。换言之,如果您不需要出于特定原因实例化游戏对象本身,那么您应该始终实例化脚本,该脚本还可以包含对游戏对象本身的引用,并根据您的喜好对其进行操作

您可以通过示例看到,他正在实例化脚本本身,而不是所有游戏对象,这样他就可以执行这些方法,而不需要引用执行它们的脚本。换句话说,如果您不需要出于特定原因实例化游戏对象本身,那么您应该始终实例化脚本,该脚本还可以包含对游戏对象本身的引用,并根据您的意愿对其进行操作

阅读此答案之前需要了解的事项:

  • 场景中的每个预设或对象都有一个
    游戏对象
    变换
  • 每个脚本/组件或游戏对象都继承自。 因此,您可以实例化任何脚本/组件或 游戏对象。几个小时前刚刚回答了这个问题,所以请参阅帖子 为了一个完整的解释

为了回答你的问题,他们两人都在做同样的事情。如果您将组件/脚本传递给
实例化
函数,Unity将获得附加到该脚本的每个脚本/组件和游戏对象,然后实例化它们

如何决定使用哪一个的示例:

假设您有一个名为“bullet”的
游戏对象
预置,该bullet附带了一个。您希望在按键时实例化项目符号,然后将其转换为项目符号

你有两个选择:

1。将子弹实例化为游戏对象,然后使用GetComponent从中获取子弹,以便您可以向其添加力:

public GameObject myPrefab;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        GameObject obj = Instantiate(myPrefab) as GameObject;
        obj.GetComponent<Rigidbody>().AddForce(new Vector3(0, 500, 0));
    }
}
使用此版本是有意义的,因为没有使用
GetComponent
。如果您只需要访问组件,那么只需使用此方法即可

在Unity的最新版本中,通过添加
Instantiate
函数的通用版本,这一点被简化了很多,因此您甚至不需要将其转换为脚本或对象类型,从而将整个过程简化为一行代码:

public Rigidbody myPrefab;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        //Instantiate and Addforce on one line
        Instantiate(myPrefab).AddForce(new Vector3(0, 500, 0));
    }
}
但我需要更长的sintax来访问包含的游戏对象。(一) 可以这样想:a.getComponentParent()

就像我的第二条评论一样,每个脚本都有一个游戏对象。您所需要做的就是获取该脚本的
游戏对象
,并获取该游戏对象的
转换

例如:

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        Rigidbody rb = Instantiate(myPrefab) as Rigidbody;
        rb.AddForce(new Vector3(0, 500, 0));

        GameObject obj = rb.gameObject;
        UnityEngine.Debug.Log("Attached Object: " + obj.name);
    }
}
最后,如果你有很多脚本,你必须在实例化预置之后访问它们,那么使用
var a=Instantiate(myPrefab)作为游戏对象


如果您有一个脚本,或者在将预置实例化为上面给出的“Bullet”示例后只想修改一个脚本,请使用#2

中的快捷方式阅读此答案之前要了解的内容:

  • 场景中的每个预设或对象都有一个
    游戏对象
    变换
  • 每个脚本/组件或游戏对象都继承自。 因此,您可以实例化任何脚本/组件或 游戏对象。几个小时前刚刚回答了这个问题,所以请参阅帖子 为了一个完整的解释

为了回答你的问题,他们两人都在做同样的事情。如果您将组件/脚本传递给
实例化
函数,Unity将获得附加到该脚本的每个脚本/组件和游戏对象,然后实例化它们

如何决定使用哪一个的示例:

假设您有一个名为“bullet”的
游戏对象
预置,该bullet附带了一个。您希望在按键时实例化项目符号,然后将其转换为项目符号

你有两个选择:

1。将子弹实例化为游戏对象,然后使用GetComponent从中获取子弹,以便您可以向其添加力:

public GameObject myPrefab;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        GameObject obj = Instantiate(myPrefab) as GameObject;
        obj.GetComponent<Rigidbody>().AddForce(new Vector3(0, 500, 0));
    }
}
使用此版本是有意义的,因为没有使用
GetComponent
。如果您只需要访问组件,那么只需使用此方法即可

在Unity的最新版本中,通过添加
Instantiate
函数的通用版本,这一点被简化了很多,因此您甚至不需要将其转换为脚本或对象类型,从而将整个过程简化为一行代码:

public Rigidbody myPrefab;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        //Instantiate and Addforce on one line
        Instantiate(myPrefab).AddForce(new Vector3(0, 500, 0));
    }
}
但我需要更长的sintax来访问包含的游戏对象。(一) 可以这样想:a.getComponentParent()

就像我的第二条评论一样,每个脚本都有一个游戏对象。您所需要做的就是获取该脚本的
游戏对象
,并获取该游戏对象的
转换

例如:

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        Rigidbody rb = Instantiate(myPrefab) as Rigidbody;
        rb.AddForce(new Vector3(0, 500, 0));

        GameObject obj = rb.gameObject;
        UnityEngine.Debug.Log("Attached Object: " + obj.name);
    }
}
最后,如果你有很多脚本,你必须在实例化预置之后访问它们,那么使用
var a=Instantiate(myPrefab)作为游戏对象

如果您有一个脚本,或者在将预置实例化为上面给出的“Bullet”示例后只想修改一个脚本,那么请使用#2中的快捷方式