内容
上图是 Unity 的核心类和我们写的脚本。正所谓在其位,谋其政
,知道我们的脚本所在的位置,也就知道脚本能做什么了。子类继承父类,因此子类也拥有了父类的能力。这个图很像族谱,直系的父类的方法(非私有)脚本是可以直接使用。脚本 => MonoBehaviour => Behaviour => Component => Object,所以这些类的功能脚本是已经继承了,了解这些类就很有必要了。
GameObject 是游戏中的游戏物体,一个游戏物体可以挂载多个组件的,组件也就是Component的后代,那么图中80%都是Component。
代码不开源,要想知道类的信息就需要用到 学习必备手册。输入想要查询的类,就有对应的介绍、字段、方法等。
Component
属性:
gameObject、tag、transform。
组件必备的3个属性,组件挂载到游戏物体(gameObject)上才能生效,而游戏物体必有名称(tag)以及所在游戏中的状态——位置缩放旋转(transform),所以这三个属性合情合理,没啥好说的。我猜这是在挂载的时候给这三个变量初始化的。
方法:
GetComonent()、GetComponents()、GetComponentInChildren()…
MeshRenderer meshRenderer = this.GetComponent<MeshRenderer>();
meshRenderer.material.color = Color.red;
Comoponent() 方法中主要的功能是提供了查找组件的功能,一个游戏物体可以挂载多个组件,多个组件之间需要协作,就必定要先找到对应的组件。
示例代码通过获取游戏物体的 MeshRenderer ,从而来把对应的材质颜色设置为红色,其中 MeshRenderer泛型是指定需要的查找的组件类型,默认返回匹配到的第一个,如果需要查找多个可以使用 GetComponents()。
var components = this.GetComponents<Component>();
foreach (var component in components){
Debug.Log(component);
}
GetComponentInChildren() 方法是获取子游戏物体的指定组件。如图:
组件 Cube 的子游戏物体就有 Cube(1)
、Cube(2)
;
同理还有 GetComponentInParent() 等方法都是类似的查找组件的功能,找指定类型组件,从父级物体找,从子级物体找,找单个,找多个。
除查找外,其他的方法比较少用或不建议用。所以记住这个类是有查找组件功能的方法就行了。
Transform
Transform 主要管理游戏物体的位置、旋转、缩放,每个游戏物体都有这个组件。
该类实现了 IEnumerable 接口,所以可以直接遍历该组件对象,其中的每一项是子游戏物体的变换组件。如下所示:
foreach (Transform child in transform) {
child.position += Vector3.up * 10.0f;
}
属性:
- position 和 localPosition: 世界坐标系位置 和 相对于父级的位置。
- rotation 和 localRotation:旋转角度。
- localScale:缩放比例。父物体的缩放比,父级缩放是2,localScale为3,此时缩放为模型大小的6倍。
- lossyScale:缩放比例。当前物体与模型的缩放比例。只有get该属性,无法 set,只能通过 localScale 去set 缩放比例。
在编译器中的 transform 位置、旋转、缩放都是相对相对于父物体的。
方法:
- Translate():向某个方向移动指定距离距离。
// 向自身Z轴移动1个单位
this.transform.Translate(0, 0, 1);
// 向世界Z轴移动1个单位
this.transform.Translate(0, 0, 1, Space.World);
- Rotate():向某个方向旋转指定角度。
// 向自身Z轴旋转1度
this.transform.Translate(0, 0, 1);
// 向世界Z轴旋转1度
this.transform.Translate(0, 0, 1, Space.World);
- RotateAround():围绕某个点,某个方向,旋转多少角度。
this.tranform.RotateAround(Vector3.zero, Vector3.up, 1);
除了控制位置、旋转、缩放外,还可以操作其父级根级子级的相关方法,因为旋转缩放位移有相对于父级的概念。
- setParent()、root属性、parent属性,childCount属性,Find()等。
// Find() 取子物体变换组件 只取到子级,孙级用递归去查,或者下面这个
Transform childTransform = this.transform.Find("子物体名称");
// 结构不会变的时候用,一般不用这个
Transform childTransform = this.transform.Find("子物体名称/孙物体名称");
// 遍历子变换组件
int count = this.transform.childCount;
for(int i = 0; i < count; i++) {
Transform childTransX = this.transform.GetChild(i);
}
总之这个类两个主要功能:①控制位置、旋转、缩放;②查找变换组件的功能。
GameObject
场景中的所有游戏物体都是 GameObject。
属性:
- activeInHierarchy:场景中的游戏对象是否激活(实际激活状态)。
- activeSelf:游戏对象局部激活状态(面板中的状态)。
因为如果父级不激活,子级局部激活,那么在场景中也是不激活的,所以会有2个状态出现来控制。
方法:
- SetActive():设置物体的启用/禁用;
// 创建一个游戏物体
GameObject lightGo = new GameObject();
// 给物体创建光,不能自己 new Light(), 设置不到 GameObject 里面
Light light = lightGo.AddComponent<Light>();
// 设置光的属性
light.color = Color.red;
ligh.type= LightType.Point;
- GetComponent() 系列:和 Component 的是一样的,Component 是组件可以找组件,现在是物体的引用也可以找组件了,当然组件也可以通过属性 gameObject 得到游戏物体。
- Find():在场景中,根据物体名称查找游戏物体(慎用,物体多时如大海捞针,耗性能)。
- FindGameObjectsWithTag():根据标签查找物体。
- FindWithTag():获取使用标签的物体(单个)。
Object
Unity 所有对象的基类。属性 name 为游戏物体的名称。
- Destroy():删除一个游戏对象、组件、资源。参数是 Object。
- DontDestroyOnload():跨场景之前调用,场景转换后保留指定的游戏物体,不会被清除。
- FindObjectOfType()、FindObjectsOfType():根据类型找激活的加载对象。
总结
核心类之间的关系,四个非常常用的类,以及类对应常用的属性和方法。不知道怎么用的时候一定要去看文档,不只是这些类,其他类也要学会自己看文档。