1、获取和设置父对象
// 获取父对象
this.transform.parent // 得到父对象的Transform this.transform.parent.name // 得到父对象的名字// 设置父对象
this.transform.parent = null; // 断绝父子关系 this.transform.parent = GameObject.Find(父名字).transform; // 认爸爸// 通过API进行父子关系的设置
// 参数一:父亲关系对象
// 参数二:是否保留世界坐标的位置、角度、缩放(bool类型),常用于动态创建UI对象给一个父对象
// true:会保留世界坐标系下的状态,和父对象进行计算得到本地坐标系的信息
// false:不会保留,会直接把世界坐标系下的transform值直接赋值到本地坐标系下,设置新的父对象后子对象Inpector界面中的Transform列表值不变化,再取消两者之间的父子关系,子对象的Transform列表值变为新的值
可以这么理解,true的时候子物体预设原来在什么位置,设立父对象后也还在原来的位置,但其Inspector界面的信息会改变;false 的时候会根据父对象的位置进行偏移,即相对父对象的位置,缩放比例也是同样,但此时其Inspector界面的信息不会改变。
this.transform.SetParent(null); this.transform.SetParent(GameObject.Find(父名字).transform);
2、抛妻弃子
// 让父对象和自己的所有的儿子断绝关系,但不影响儿子和孙子之间的关系
this.transform.DetachChildren();
3、获取子对象
// 按名字查找儿子,找到其Transform信息
// 不同于GameObject的查找,该方法可以找到失活的对象
// 只能找到儿子,不能找到孙子
Transform obj = this.transform.Find(子对象名字);// 效率比GameObject的效率较高,因为确定了范围
// 遍历儿子
// 如何得到有多少个儿子,失活的对象也会算上,不会算上孙子
this.transform.childCount;// 通过索引号得到对应的儿子,返回儿子的Transform信息,如果编号超出范围会报错
for(int i = 0; i < this.transform.childCount; ++i) { Transform child = this.transform.GetChild(i); }
4、儿子的操作
// 判断自己的爸爸是谁
this.transform.IsChildOf(Transform parent)// 得到自己作为儿子的编号
this.transform.GetSiblingIndex()// 把自己设置为第一个儿子
this.transform.SetAsFirstSibling();// 把自己设置为最后一个儿子
this.transform.SetAsLastSibling();// 把自己设定为指定编号的儿子,如果超出范围(负数或者更大的数)直接设置为最后一个
this.transform.SetSiblingIndex(编号);
练习:
(1)将子对象按名字长短进行排序
(2)传入名字查找子对象,即使是子对象的子对象也可以找到
两者都用扩展方法解决:
public static class TransformExtend { public static void SortChild(this Transform trans) { List<Transform> childs = new List<Transform>(); for (int i = 0; i < trans.childCount; ++i) { childs.Add(trans.GetChild(i)); } childs.Sort((x, y) => { return x.name.Length < y.name.Length ? -1 : 1; }); for (int i = 0; i < childs.Count; ++i) { childs[i].SetSiblingIndex(i); } } public static void FindAllChildByName(this Transform trans, string name, ref int count) { for(int i = 0; i < trans.childCount; ++i) { Transform child = trans.GetChild(i); if (child.name == name) { ++count; } if (child.childCount > 0) { // FindAllChildByName(child, name, ref count); child.FindAllChildByName(name, ref count); } } } }

本文介绍了Unity中关于Transform组件的父子关系管理,包括如何获取和设置父对象,解除父子关系,查找子对象,以及对子对象的各种操作。内容涵盖设置父对象时保留世界坐标的选项,遍历和获取子对象的方法,以及对子对象位置的调整等实践练习。
1559

被折叠的 条评论
为什么被折叠?



