U1L4——MonoBehaviour的重要内容

MonoBaviour

MonoBehaviour 类是一个基类,所有 Unity 脚本都默认派生自该类。当您从 Unity 的项目窗口创建一个 C# 脚本时,它会自动继承 MonoBehaviour,
MonoBehaviour 类提供了框架,允许您将脚本附加到编辑器中的游戏对象,并提供诸如Start()和Update()等常用事件的挂钩。

重要的类 - MonoBehaviour - Unity 手册

脚本内继承该类且脚本与继承该类的类名一致才能使脚本挂载到一些对象上注意其派生类绝不能new出来,同时也不再建议写构造函数

相关信息:继承MonoBehaviour基类的类的规则、关于MonoBehaviour的类中的构造函数

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//重要成员——获取游戏对象信息及其几何信息,以及脚本是否激活
this.gameObject //获取该脚本所挂载的游戏对象的属性,可以对其内容例如名字,位置等变量进行操作
this.transform //获取该脚本所挂载的对象的使对象变换的类的属性,可获取例如位置,角度,缩放大小等内容,等同于gameObject.transform
this.transform.position //该脚本所挂载的对象位置的属性,对其进行修改以改变挂载对象的位置
this.transform.eulerAngles //该脚本所挂载的对象角度的属性,对其进行修改以改变挂载对象的面朝方向
this.transform.lossyScale //该脚本所挂载的对象缩放大小的属性,对其进行修改以改变挂载对象的大小
this.enabled //脚本是否激活的属性,可以修改以激活或者失活
//重要方法——主要是查找各种对象的脚本
this.GetComponent<>() //得到依附脚本的其他脚本的方法,可以通过文件名,Type或者泛型获取,一般都建议用泛型,因为无需二次转换
this.GetComponents<>() //得到自己挂载的对象多个脚本的方法,可用数组或者列表装载,若用列表则需要将列表作为参数填入
this.GetComponentInChildren<>() //得到子对象挂载的单个脚本的方法,默认也会找自己身上是否挂载该脚本
this.GetComponentsInChildren<>(,) //得到子对象挂载的多个脚本的方法,可用数组或者列表装载,会顺着父子关系线去查找所有对象
this.GetComponentInParent<>() //得到父对象挂载的单个脚本的方法,默认也会找自己身上是否挂载该脚本
this.GetComponentsInParent<>(,) //得到父对象挂载的多个脚本的方法,可用数组或者列表装载,会顺着父子关系线去查找所有对象
this.TryGetComponent<>(out ) //确认是否存在该脚本的方法,是返回True

重要成员

gameObject

可以获取该脚本所挂载的GameObject​,并对其中内容进行操作

1
print(this.gameObject.name);

transform

获取依附的游戏对象(GameObject)的Transform​类,并可对其中内容,例如位置,角度,缩放大小进行操作

1
2
3
4
5
//得到对象位置信息
print(this.transform.position); //位置
print(this.transform.eulerAngles); //角度
print(this.transform.lossyScale); //缩放大小
//this.gameObject.transform这种写法和上面是一样的效果 都是得到依附的对象的位置信息

enabled

获取脚本是否激活

1
this.enabled = false;

获取其他脚本依附的gameobject和Transform信息

1
2
3
4
5
6
public Lesson3 otherLesson3;    //通过Unity编辑器确认otherLesson3对应的对象
void start()
{
print(otherLesson3.gameObject.name);
print(otherLesson3.transform.position);
}

重要方法

得到依附对象上挂载的其他脚本

以下的方法都有文件名,typeof​,泛型方法,但一般都建议用泛型,因为泛型无需二次转换

注意!如果获取失败 比如说没有对应的脚本 会默认返回空(null)

得到自己挂载的单个脚本

注意!如果有重复脚本我们将无法确定得到的是哪个脚本,所以一般都不建议挂载同一脚本

根据脚本名获取:

1
2
Lesson3_Test t = this.GetComponent("Lesson3_Test") as Lesson3_Test;
print(t);

根据Type​获取

1
2
t = this.GetComponent(typeof(Lesson3_Test)) as Lesson3_Test;
print(t);

★ 根据泛型获取 一般都建议使用泛型获取 因为不用二次转换

1
2
t = this.GetComponent<Lesson3_Test>();
print(t);

只要你能得到场景中别的对象或者对象依附的脚本,那你就可以获取到该对象的所有信息

得到自己挂载的多个脚本

有两种装的方法,一个是数组,一个是列表,使用列表需要作为参数填入方法!

1
2
3
4
5
6
Lesson3[] array = this.GetComponents<Lesson3>();
print(array.Length);

List<Lesson3> list = new List<Lesson3>();
this.GetComponents<Lesson3>(list);
print(list.Count);

得到子对象挂载的脚本(它默认也会找自己身上是否挂载该脚本)

后面的参数默认是false​,即不查看失活的子对象,如果填入ture则即使是失活的子对象也会查找

获得单个子对象挂载的脚本
1
2
t = this.GetComponentInChildren<Lesson3_Test>(true); //后面的参数默认是false不查看失活的子对象,如果填入ture则即使是失活的子对象也会查找
print(t);
获得多个子对象挂载的脚本

有两种装的方法,一个是数组,一个是列表,使用列表需要作为参数填入方法!

注意!这里会向下查找所有的对象,也就是说在父子关系中所有更低的对象都会查找!(仅会顺着父子关系线去查找,兄弟对象包括其子物体不会查找!)

1
2
3
4
5
6
Lesson3_Test[] lts = this.GetComponentsInChildren<Lesson3_Test>(true);
print(lts.Length);

List<Lesson3_Test> list2 = new List<Lesson3_Test>();
this.GetComponentsInChildren<Lesson3_Test>(true, list2);
print(list2.Count);

得到父对象挂载的脚本(它默认也会找自己身上是否挂载该脚本)

和查子对象脚本不一样,没必要写是否查失活父对象的脚本的参数,因为不可能有查失活父对象脚本的情况

获得单个父对象挂载的脚本

从调用该方法的游戏对象开始,沿着父链向上查找,直到找到一个包含指定组件(类型为 T​)的游戏对象。
这意味着它不仅会查找直接的父对象,还会继续查找父对象的父对象,直到到达场景的根对象或者找到指定的组件为止。

1
2
t = this.GetComponentInParent<Lesson3_Test>();
print(t);
获得多个父对象挂载的脚本

沿着父链会向上查找所有的对象,也就是说在父子关系中所有更高的对象都会查找!(仅会顺着父子关系线去查找,兄弟对象包括其子物体不会查找!)

有两种装的方法,一个是数组,一个是列表,使用列表需要作为参数填入方法!

1
2
3
4
5
6
lts = this.GetComponentsInParent<Lesson3_Test>();
print(lts.Length);
List<Lesson3_Test> list3 = new List<Lesson3_Test>();
this.GetComponentsInParent<Lesson3_Test>(true, list3);
print(list3.Count);

尝试获取脚本

通过了一个更加安全的 获取单个脚本的方法 如果得到了就返回ture​,然后再来进行逻辑处理即可

1
2
3
4
5
Lesson3_Test l3t;
if(this.TryGetComponent<Lesson3_Test>(out l3t))
{
//逻辑处理
}

其他部分的MonoBehaviour重要内容

生命周期函数

内容在U1L2:生命周期函数

延迟函数

内容在U2L6:延迟函数

协同程序

内容在U2L7:协同程序

IK相关

内容在U3L18-6:动画IK控制