Unity 您所在的位置:网站首页 unity获取其他物体上的脚本上的方法 Unity

Unity

#Unity| 来源: 网络整理| 查看: 265

Unity——访问物体与组件 GameObject和Transform的区别与关系 区别

GameObject(物体)与Transform(变换)是Unity中两套不同的系统

GameObject指的是对象本体,类似于我们人这个实体,每个人都是独立的个体,物体之间原则上没有任何逻辑关系。Transform指的是物体在局内的表现,例如坐标、缩放、行为、碰撞等等,类似于人的外表、技能、其他属性等等,变换之间有所属关系,像人们的工作生活都交织在一起。 联系 Transform最基本的属性就是坐标、旋转角以及缩放这三个属性。每一个GameObject唯一对应一个Transform,每一个Transform也唯一对应一个GameObject,所以利用这个特点将两套系统联系起来,Transform有gameObject属性,GameObject也有transform属性。事实上,类似于人类社会,我们并不会太多的去关注GameObject的改变(大家都是人),它的属性很多都是固定的(比如模型的形状),当然我们可以做到操作模型上的每一个像素点,但我们更多的是关注Transform,它的内容更加丰富,可玩性更强,所以一个Transform就代表了一个GameObject的所有表现(除了Active属性)。Transform有所属关系:不同级的物体之间没有所属关系,但不同级物体的Transform之间是有所属关系的,子级的Transform以Component(组件)的身份存在于父级transform之下——外部的Component,Hierarchy面板就是以这个关系来显示物体的。而我们在Inspector面板中添加的组件就成为了transform的属性、方法、表现以及行为等——内部的Component。

这里有一个认知上的重点:GameObject类型里没有cube、spher这些分类,只有在Inspector中添加了相应的组件它才有对应的属性。如果一个Button的Inspector中没有Button这个组件,那也就不是按钮;一个球,它有Button组件,那他就是一个按钮。所以比如用Transform的方法获取Button类型的对象的时候,它在意的不是你创建时是不是在Create里选了Button,而在意一个对象在Inspector里是不是有Button组件,此处也体现出了GameObject与Transform的区别与联系。

访问GameObject(返回值为GameObject类型) 思路 使用GameObject的Find()系列方法使用Transform类型的gameObject属性 GameObject.Find()系列 GameObject.Find()系列方法会进行全场景搜索物体,返回GameObject类型的对象或对象数组只能找到状态为Active的物体,如果一个物体active=false,则他以及他的子物体一个也找不到GameObject.Find()查找同名物体的搜索顺序很奇怪: 顶级物体优先于子物体,顶级物体之间创建时间越晚越优先只要不是顶级物体: 从上到下顺序优先子物体优先于父物体 GameObject.Find()真的占资源,非要用的话确保不要重名且不要再Update()中调用,尽量用路径意外发现:如果没有叫“sonson”的物体,而查找“sonson”,会自动找名为son且子物体也为son的部分,返回子物体,只适用于两层物体名连接。 GameObject.Find(string name);//通过对象名称获取单个游戏对象,有重名物体的话加上路径(string path/name) GameObject.FindWithTag(string tag);//通过标签获取单个游戏对象,返回找到的第一个对象或null GameObject.FindGameObjectsWithTags(string tag);//通过标签获取多个游戏对象,赶回GameObject[] GameObject.FindObjectOfType(System.Type type);//通过类型获取单个游戏对象,返回找到的第一个对象或null GameObject.FindObjectsOfType(System.Type type);//通过类型获取多个游戏对象,返回Object[] GameObject.FindObjectsOfType()//通过指定类型获取多个游戏对象,返回T[] GameObject.FindObjectOfType()//通过指定类型获取多个游戏对象,返回T类型的对象或null 后面几个方法通常用于在全场景中批量检查或管理物体 TransForm系列 Transform系列方法返回的都是Transform类型的结果,可以使用gameObject属性来得到GameObject类型的结果 例如 transform。gameobjec、GetComponent().gameObjectTransform方法可以扫描到acti==false的对象,但是顶级父对象必须是active的一般预先设置一个空GameObject,然后将所有组件放在其下,查找的时候就很方便了 Transform.Find(string path/name).gameObject;//按照path查找,只有name的话在子物体中查找(不包括孙物体) Transform.childCount与Transform.GetChild(int index)//搭配可以根据下标精确获取子级物体 访问组件Component 思路:先找到GameObject或Transform,再访问Compontent

这里说明一下GameObject.GetComponent()、Transform.GetComponent以及GetComponent()的关系:首先,它们三个的作用和机制是等价的,都是先获取到一个GameObject,然后返回GameObject上的组件。Transform.GetComponent和GetComponent()会首先找到所连接的GameObject,然后再该GameObject上找到所连接的匹配的Component。下面用Transform来说明,因为Transform的应用更广泛,其它两种不再描述。

Transform.GetComponent(Type type)系列

GetComponent()系列方法查找时先从自己开始,默认不包括InActive物体的组件

Transform.GetComponent()系列,返回找到的第一个组件或null //返回Component对象,类型转换有点麻烦 Transform.GetComponent(Type Type); Transform.GetComponentInParent(Type Type);//包括自己向上查找(递归父对象,包括父之父,与叔对象无关) Transform.GetComponentInChildren(Type Type);//包括自己向下查找(遍历子对象,包括自己的所有子孙) //返回T类型对象,建议使用 Transform.GetComponent(); Transform.GetComponentInParent(); Transform.GetComponentInChildren(); Transform.GetComponents()系列,返回结果数组(重载方法可以返回集合)或null Transform.GetComponents(Type Type);//查找包括自己在内的子对象,不包括孙对象 Transform.GetComponentsInParent(Type Type); Transform.GetComponentsInChildren(Type Type); Transform.GetComponents(); Transform.GetComponentsInParent(); Transform.GetComponentsInChildren(); 补充

GetComponent()系列方法有重载,包括是否扫描inActive的对象以及将结果返回为List之类

Type类型传参是可以用typeof(类型) 或者 “类型”

不使用泛型的方法返回的是Component类型的对象,要转换成指定的组件对象时需要类型转换例:Button btn=gameObject.GetComponent(typeof(Button)) as Button;

这里的Type指的是物体内组件,Transform、BoxCollider之类,切记传参时组件的名字不要有空格



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有