上面这个是Unity核心类图
第一部分 --- Component类
提供了查找组件的方法(当前物体的,子物体,父物体的)
1.颜色(color)是材质(meterial)控制的,meterial(材质)是由Mesh Renderer(网格渲染器)组件控制的
2.在程序中设置颜色的时候并不是用的1-255这个数值区间,而是用0-1这个数值区间,如果美工给了1-255区间的颜色数值的话,我们要按照比例将数值转换为0-1区间的对应数值
如美工给了100,则设要转换的值为x,则有 100/255 = x / 1 ---- 通过转换式求出的 x 就是我们程序中实际设置的值
3.在脚本中访问其它组件的时候,要用 this(表示是本脚本访问) . GetComponet<要找的组件对应的类名> --- 这个方法是Component类中的方法,作用是找到对应类的引用。
返回的是对应组件的引用,没有就返回空(注意Type的意思是标签)
上面这行代码的作用是获取脚本目前挂载的游戏物体上的所有组件的引用(以数组的形式返回,同时脚本也是组件)
1.深度首先搜索改为深度优先搜索
2.之所以提一句深度优先搜索,是因为这个方法找组件的时候是先从自身开始找起的。
对于不带s的版本,如果在自身找到的话则直接返回自身的对应组件,结束查找;如果找不到的话再从下一级子物体的组件中找,找到返回,结束查找,找不到继续去下一级子物体找...依次类推
对于带s版本则是从自身开始,到最后一层中的最后一个子物体结束,将所有对应的组件引用打包以数组的形式返回
注意这个方法还有一个带 s 的版本,二者之间的区别就是不带s是返回一个组件引用或子对象,而第 s 则是返回所有组件引用和子对象
使用场景:找子物体的某个组件;使用条件:只有子物体具有这个组件
与Children相对应的还有一个Parent版本,这个版本其实就相当于Children版本的逆过程,从自身开始查找,到第一层的父物体(第一层只能有一个父物体)结束,其它相同。
1.要传的参数是一个标签实例
2.这行代码实现的功能是将调用方法的对象 other的标签 与 我们传的标签实例 player进行比较,若相同返回true,否则返回false
第二部分 --- Transform类
可查找的变换组件对象包括父物体,子物体和根物体的变换组件对象 --- 其中查找子物体又分为通过索引和通过名称两种方式,而父物体和根物体都是通过点操作符 + 属性名获得(parent 和 root)
可改变的是位置,旋转和缩放
缩放指的是缩放的比例
1.每一个游戏物体都有一个transform组件,通过这个组件我们可以改变游戏物体的位置,旋转和缩放,同时我们也可以通过这个组件去遍历和访问该游戏物体的子物体的transform组件(注意!!只能遍历到该游戏物体的第一代子物体,第二代子物体往后都遍历不到(即子物体的子物体))
遍历实例如下:
1.通过脚本访问继承过来的transform引用(该引用指向一个实例化的transform组件对象,该对象中存在一个数组,数组中装的是指向游戏物体的所有第一代子物体的transform组件的引用)
2.用foreach方法遍历数组中的每一个引用,并通过引用访问和操作第一代子物体的transform组件
注意position获取的是游戏物体在世界坐标系中的位置
这里的localPosition获取的则是游戏物体相当于其上一级父物体的坐标系中的位置
点击Unity左上角的三个点可以切换Unity的运行模式,切换之后的变化如下:
子物体的transform组件的positon,rotation等都是相对于上一级父物体的坐标系的,应有local前缀,但是在Normal模式下,没有前缀显示,而在Debug模式下则有local前缀显示。
ps:哪怕是第一层父物体,其postion,rotation,scale都是有local前缀的,此时的第一层父物体相对的坐标系是世界坐标系
1. 第一层游戏物体的position和localposition是相同的,而再往下一层后就不相同了
2.轴心点指的是物体坐标系的原点,这个点默认在物体的中心,且我们可以自己改动轴心点的位置
(黄,红,蓝三线的交点就是轴心点,默认物体中心,位置可变)
1.rotation和positon一样,分为相对于世界坐标系的无前缀,和相对于父物体的有local前缀
2.但是scale则不同,他分为 localScale 和 lossyScale
localScale:相对于父物体缩放比例(对于第一层父物体,其模型放进来后scale默认为1比1比1,若调整该scale则是模型相对于一开始的自身进行缩放,比如调为1比2比1时,模型的y轴方向长度就会变为原来的两倍)
比如local 为 1 2 1 ,则表示的是子物体相对于父物体的x轴方向长度为1比1,y轴方向长度为1比2,z轴方向长度为1比1
(意思就是和父物体的x,z轴方向长度一样,但y轴方向长度是父物体的两倍)
3.localScale 和 lossyScale 还有一个区别就是localScale为可读可写,而lossyScale则为只读不写
接下来介绍Transform类的方法
1.Translate方法,输入一个参数 --- 同时包含距离和方向的向量,就可以将物体移动到对应的位置
注意!移动方式是平移(物体本身不会发生转动)
1.如果我们希望这个向量是基于世界坐标系的话,我们还需要添加一个参数 --- Space.Self / World
如果是要表示世界坐标系的话则选World,如果是自身的坐标系的话就选Self
1.注意上面第一个10°改为1°
2.此处介绍的是如何如何通过Transform类来控制旋转
3.对于Rotate方法,单位是°度
1.如果想让物体绕某个点,某个轴旋转的话,我们需要使用RotateAround方法
2.这个方法具有两个三个参数 ,分别是:三维点,表示轴方向的法向量(该法向量在世界坐标系中汇出),旋转角度
3.三个参数表示的意思是:以给定三维点作为原点,将法向量平移到该三维点处形成一个轴,然后游戏物体绕该轴作旋转(和“原点”距离不变,旋转给定角度)
除了通过Transform类改变游戏物体的位置,旋转和缩放外,它还提供给我们一些方法去查找与游戏物体相关的其它游戏物体的变换(transform组件)
1.上面第一个transform.root的作用是获得当前脚本挂载的游戏物体的根物体的变换组件
首先,一个游戏物体的根物体是指该游戏物体对应的最源头的那个父物体,即第一层游戏物体(有且只有一个),该游戏物体的根物体是其本身
2.变换组件在这里指的是一个实例对象,该对象所属的类是Transform类
3.当然除了获取根物体变换组件外,我们还可以直接获取其父物体变换组件,操作方式与上相同
1.除了获取游戏物体的父物体,根物体的变换组件之外,我们还可以通过变换组件来为游戏物体指定一个父物体(注意这个游戏物体本身不能有父物体)
2.操作方式如上。我们需要传两个参数:
第一个参数是指向某个游戏物体(作为父物体)的变换组件对象的引用。
一.传这个引用的方式有两种,一种是直接将特定的,指向游戏物体的变换组件的引用作为参数传递,这个方法的缺点是传的引用是定死的,在内部已经定好了。
二.第二种方法是建立一个具有公共权限的Transform引用,然后将这个不指向任何变换组件的引用作为参数传递。
这样做了之后就会在游戏物体的组件面板的脚本的位置处出现一个可选择框
这个框的名字就是我们创建的引用的名字,我们可以往这个框中拖入游戏物体(除脚本挂载的游戏物体本身的父子物体) ,此时就相当于将该游戏物体的变换组件对象传给这个引用指向
3.第二个参数是一个bool值:
当bool值为true的时候,则表示作为子物体的游戏物体(即脚本挂载的游戏物体)其旋转,缩放和位置依然是相对于世界坐标系的
但当bool值为false的时候,则是相对于父物体的本地坐标系的。
举个例子就是假设物体A相对于世界坐标系的位置为0,1,0,B则是0,2,0
若B设为A的父物体,则为true时,A的位置等依旧相对于世界坐标系,不发生改变,为0,1,0
为false时,A的位置等变为相对于B的本地坐标系,此时在面板中数值不变依然为0,1,0,但这个数值是相对于B的本地坐标系的数值,相对于世界坐标系的数值已经变为了0,3,0了
(PS:如果为ture的话也可以不写这个参数,因为这个参数有默认值,且默认值为ture)
讲完父物体之后我们开始讲子物体
这个方法需要传一个字符串参数 --- 本质是通过子物体的名字来查找子物体,查找到后返回的是对应子物体的变换组件对象(Transform组件) --- 对象要用对应的引用来接收。
1.需要注意的是这个方法只能够找到孩子(第一层子物体),孙子再往后的都找不到
2.如果想要找到第二层,第三层,第四层....子物体的话,需要通过写路径的方法来查找
比如B是A的子物体,C是B的子物体,如果我们在A上挂载脚本要找C的话,传的字符串参数应该为“B物体的名称/C物体的名称” --- 其它类似
使用这个方法找孙子有一个前提:就是父子物体路径绝对不会发生改变时再写,不然的话会出现查找错误
第二种找子物体的方法 --- 索引查找方法 --- GetChild()
1.使用索引查找法的前提是知道游戏物体自身具有多少个子物体 ---
有一个transform类中有一个属性记录了游戏物体有多少个子物体
1.只能够获取儿子(第一层子物体),不能够获取孙子等
2.第一个子物体的索引是0,第二个是1.....总的子物体个数等于 childCount,,最后一个子物体的索引是 childCount - 1
3.将索引传给GetChild就能够找到对应的子物体
该方法是将挂载该脚本的游戏物体与其子物体之间的父子关系解除