Unity3d–学习笔记之GameObject和Transform的区别
对Transform的困惑
查找游戏对象的方法有transform.Find()和GameObject.Find(),但为什么transform是一个表示位置属性的组件却可以find游戏对象呢?
GameObject
Gameobject是一个类型,所有的游戏物件都是这个类型的对象。
gameobject是一个对象, 就跟java里面的this一样, 指的是这个脚本所附着的游戏物件
Transform
Transform是一个类,用来描述物体的位置,大小,旋转等等信息。
transform是Transform类的对象,依附于每一个物体。也是当前游戏对象的一个组件(每个对象都会有这个组件)
transform与gameObject
-
二者的含义
transform : 当前游戏对象的transform组件
gameobject :当前游戏对象的实例 -
两者的联系和区别
* 在unity中每个游戏对象都是一个gameobject. monodevelop中的gameobject就代表着本脚本所依附的对象.
每个gameobject都包含各种各样的组件,但从这点可以看出transform是gameobject的一个组件,控制着gameobject的位置,缩放,和旋转,而且每个gameobject都有而且必有一个transform组件
* gameobject.find用来获取场景中那个我们需要查找的对象(object). 而transform.find方法则是获取当前对象的子对象下我们需要获取的目标对象位置信息。* 注意: 在update() 中尽量不使用find() 方法,影响性能,下面详细说。
-
gameobject.transform与transform.gameobject
* gameobject.transform,是获取当前游戏对象的transform组件. 所以在start函数中 gameobject.transform 和this.transform,指向的都是同一个对象。即:gameobject.transform == this.transform== transform * transform.gameobject:可以这么理解为:获取当前transform组件所在的gameobect 所以在start()函数中transform.gameobject == this.gameobject == gameobect
所以他们可以无限的引用下去
意思就是。gameobject.transform == this.transform == gameobject.transform.gameobject.tranform == tranform.gameobect.transform
GameObject.Find
通过名字或路径查找游戏对象。
GameObject.Find(“GameObject”);
GameObject.Find("GameObject/ChildGameObject);
使用规范:
- 无法查找隐藏对象隐藏对象包括查找路径的任何一个父节点隐藏(active=false)
- 如果查找不在最上层,建议合理使用路径查找,路径查找是把双刃剑
优点1:解决查找中可能出现的重名问题。
优点2:如果有完全的路径,减少查找范围,减少查找时间。
缺点: 路径或结构调整后,容易影响到程序中的查找,需要重新定位查找路径。 - 如果路径查找中的任何一个父节点active=false,这个对象都将查找不到。
- 使用方便但效率低下。
此查找相当于递归遍历查找,虽使用方便但效率堪忧,建议在Start()函数中查找对象并保存引用,切忌在Update()中动态查找。
Transform.Find
通过名字或路径查找当前游戏对象的子对象。
- 可以查找隐藏对象
- 支持路径查找
- 查找隐藏对象的前提是transform所在的根节点必须可见,即active=true
GameObject root = GameObject.Find(“root”);
root.SetActive(false); // 根节点为空
// 总是查找失败
root.transform.Find(“root/AnyChildObjectName”);
实际开发:
实际开发中会将功能预制体放到一个可见的GameObject目录下,将这个GameObject目录作为查找根节点,下面的所有对象(隐藏、非隐藏)都可以查找到。
你可以把”map”节点放在一个active = true的MapRoot上,无论是关闭 或者 显示 代码中写起来都很方便。 假如你的map节点就是顶级节点,那么它一旦天生acive = false ,那么你将无法得到它的对象,更无法设置它的属性了。
GameObject root = GameObject.Find(“MapRoot”);
GameObject map = root.transform.Find(“map”).gameObject;
map.SetActive(true);
其他查找方法
GameObject.FindGameObjectsWithTag(“tag”)
GameObject.FindWithTag(“tag”)
根据一个标记来获取游戏对象,返回一个 或者 一个数组