Unity-Transform类-父子关系
Transform拓展方法练习
public static class Tuozhan
{
拓展方法,把子对象按名字长度排序
public static void Sortchild(this Transform obj)
{
List<Transform> Indexs = new List<Transform>();
for (int i = 0; i < obj.childCount; i++)
{
Indexs.Add(obj.GetChild(i));
}
Indexs.Sort((a, b) =>
{
if(a.name.Length> b.name.Length)
return 1;
else
return -1;
});
for (int i = 0; i < Indexs.Count; i++)
{
Indexs[i].SetSiblingIndex(i);
}
}
拓展方法,根据名字找子对象,儿子的儿子也能找到的那种
public static Transform FindDeepChild(this Transform obj, string name)
{
Transform target = null;
if (obj.Find(name) != null)
{
target = obj.Find(name);
return target;
}
//如果找到了就返回
//找不到就让儿子找
for (int i = 0; i < obj.childCount; i++)
{
if (obj.GetChild(i).FindDeepChild(name) != null) //如果儿子找到了就返回
return target = obj.GetChild(i).FindDeepChild(name);
}
return target;
}
}
父子关系API
获取和设置父对象transform.SetParent()
//获取父对象
//print(this.transform.parent.name);
//设置父对象 断绝父子关系
//this.transform.parent = null;
//设置父对象 认爸爸
//this.transform.parent = GameObject.Find("Father2").transform;
//通过API来进行父子关系的设置
//this.transform.SetParent(null);//断绝父子关系
//this.transform.SetParent(GameObject.Find("Father2").transform);//认爸爸
参数一:我的父亲
参数二:是否保留世界坐标的 位置 角度 缩放 信息
true 会保留 世界坐标下的状态 和 父对象 进行计算 得到本地坐标系的信息
false 不会保留 会直接把世界坐标系下的 位置角度缩放 直接赋值到 本地坐标系下
this.transform.SetParent(GameObject.Find("Father3").transform, false);
抛妻弃子transform.DetachChildren();
就是和自己的所有儿子 断绝关系 没有父子关系了
this.transform.DetachChildren();
获取子对象
按名字查找儿子transform.Find能找失活对象
//找到儿子的 transform信息
//Find方法 是能够找到 失活的对象的 !!!!! GameObject相关的 查找 是不能找到失活对象的
print(this.transform.Find("Cube (1)").name);
//他只能找到自己的儿子 找不到自己的孙子 !!!!!!
//print(this.transform.Find("GameObject").name);
//虽然它的效率 比GameObject.Find相关 要高一些 但是 前提是你必须知道父亲是谁 才能找
遍历儿子transform.childCount
transform.GetChild(0)
//如何得到有多少个儿子
//1.失活的儿子也会算数量
//2.找不到孙子 所以孙子不会算数量
print(this.transform.childCount);
//通过索引号 去得到自己对应的儿子
//如果编号 超出了儿子数量的范围 那会直接报错的
//返回值 是 transform 可以得到对应儿子的 位置相关信息
this.transform.GetChild(0);
for (int i = 0; i < this.transform.childCount; i++)
{
print("儿子的名字:" + this.transform.GetChild(i).name);
}
儿子的操作
判断自己的爸爸是谁transform.IsChildOf()
//一个对象 判断自己是不是另一个对象的儿子
if(son.IsChildOf(this.transform))
{
print("是我的儿子");
}
得到自己作为儿子的编号.GetSiblingIndex()
print(son.GetSiblingIndex());
把自己设置为第一个儿子
son.SetAsFirstSibling();
最后一个儿子
son.SetAsLastSibling();
指定个儿子
son.SetSiblingIndex(1); 就算你填的数量 超出了范围(负数或者更大的数) 不会报错 会直接设置成最后一个编号