DLFM:Unity C#编写教程——20.GetComponent方法与脚本优化思路
MaxBlazeResFire
2021年03月06日 13:00
收录于文集
共20篇

注意到,如果我们每增加一个参数,所有物体的脚本中都要追加声明,看起来是一件十分麻烦的事情。

而在之前的教程中,我们学习了FindObjectOfType<>()方法来获取场景中的一个物体。

但是,我们注意到:

目前方法的关系

例如:

假设我们知道

1.场景中有"MainLine&#​34;物体。

2."MainLine&#​34;物体上有MainLine组件。

 因为1,2的存在,我们有GameObject.FindObjectOfType<MainLine>().gameObject来获取"MainLine&#​34;这个物体

我们获取了MainLine这个物体。

由此推出:

现在我们知道

1.场景中有"MainLine&#​34;物体。

2."MainLine&#​34;物体上有MainLine组件。

3.我想改变"MainLine&#​34;上MainLine组件的某一数值。

4.我可以获取"MainLine&#​34;.

5.我需要一个方法,获取到"MainLine&#​34;(这是已知!)上的MainLine.

 既然"MainLine&#​34;这个物体已知,我们就可以令物体类型数据x为"MainLine&#​34;物体。

代码块
C#
自动换行
复制代码
GameObject x = GameObject.FindObjectOfType< MainLine >().gameObject;
复制成功

然后使用本节新要介绍的重点

代码块
C#
自动换行
复制代码
object.GetComponent<>()
复制成功

来从一个物体上获取存在于该物体的组件。

例如我们可以:

获取

我们发现:

1.MainLine是一个物体类型。

2.MainLine类型的数据line被赋值了从x身上获取到的MainLine组件。

3.这意味着line与附着在x身上的MainLine组件有着相同的意义。

4.我们从如下语句中还可以发现:

代码块
C#
自动换行
复制代码
GameObject x = GameObject.FindObjectOfType< MainLine >().gameObject;
复制成功

既然FindObjectOfType<>()的尖括号中指定了一个类型,我们为什么要从GameObject绕弯子,而不直接获取这个类型的物体上面所附着的同名组件呢?

答案是肯定的。

显然,如果我们去掉该语句后面的.gameObject,会发现

它可以直接给相同物体类型的数据赋值。

获取物体的同时也为其同类型数据赋值

也就是说我们充分地发挥了它的效率:找到附着x组件的物体的同时我们并不需要该物体,而是直接把x组件赋给了与之有相同意义的x类型的数据。

这样,该物体类型数据有了组件的意义,就可以直接修改其中的值数据

获取并快捷修改其中数据

按照这样的理解:

只要场景中存在附着x组件的物体y

有以下几个相等的关系式:

代码块
C#
自动换行
复制代码
y = GameObject.FindObjectOfType< x >().gameObject; //值为物体y
x = GameObject.FindObjectOfType< x >(); //值为组件x
x = y.GetComponent< x >(); //值为组件x
y = GameObject.FindObjectWithTag(""); //值为物体y
复制成功

那么所有脚本中类似的关系,就可以互相替代简化了。

请仔细理解本节所有内容。