U1L7-5——父子关系

Transform中的父子关系相关

父子化是使用 Unity 时需要理解的最重要概念之一。
当一个游戏对象是另一个游戏对象的__父__项时,__子__游戏对象完全跟随其父项移动、旋转和缩放。
可将父子化看作是手臂与身体之间的关系;每当身体移动时,手臂也随之移动。
子对象也可以有自己的子项,以此类推。所以,手可以视为手臂的“子项”,然后每只手都有几根手指,等等。
任何一个对象都可以有多个子项,但只有一个父项。这些多级父子关系形成了变换组件的_层级视图
层级视图最顶层的对象(即层级视图中唯一没有父项的对象)称为__根
_。

在脚本中,我们可以用Transform类中的属性和方法来操作父子关系

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
this.transform.parent.name        //通过transform获取父对象的的名字
this.transform.parent //父对象的Transform对象的属性,可以通过这个获取、设置、脱离父对象
this.transform.SetParent() //设置或者脱离父对象
this.transform.SetParent(, ) //设置或者脱离父对象,第二个参数填true或者false来决定是否保留世界坐标的位置、角度、缩放
this.transform.DetachChildren() //抛弃自己的所有子对象(对子对象的子对象不起作用)
this.transform.Find() //按照名字寻找子对象,可以找到失活的对象,不能直接找到子对象的子对象
this.transform.childCount //获取自身所有子对象的数量,包括失活的子对象,但不包括子对象的子对象
this.transform.GetChild() //通过索引号,返回自己对应的子对象的Transform对象
son.IsChildOf() //判断自己是不是另一个对象的子对象的方法
son.GetSiblingIndex() //得到自己作为子对象的编号
son.SetAsFirstSibling(); //把自己设置为第一个子对象
son.SetAsLastSibling() //把自己设置为最后一个子对象
son.SetSiblingIndex(10); //把自己设置为指定第几个子对象

获取和设置父对象

1
2
3
4
5
6
//获取父对象
print(this.transform.parent.name);
//设置父对象 脱离父对象
this.transform.parent = null;
//设置父对象 依附新的父对象 (不需要自行预先执行脱离原父对象的逻辑)
this.transform.parent = GameObject.Find("Lesson9").transform;

设置父对象的方法

  • 参数一:选择依附的新父对象

  • 参数二:是否保留世界坐标的位置 角度 缩放

    • true​ 会保留 世界坐标下的状态 和 父对象 进行计算 得到本地坐标系的信息
    • false​ 不会保留世界坐标系下的各种信息 会直接赋值到本地坐标系下
1
2
3
//通过API来进行父子关系的设置
this.transform.SetParent(null); //脱离父对象
this.transform.SetParent(GameObject.Find("Father").transform); //依附新父对象
1
this.transform.SetParent(GameObject.Find("Lesson9Father").transform, true);    //不会保留世界坐标系下的各种信息 会直接赋值到本地坐标系下

放弃所有子对象

抛弃自己的所有子对象(对子对象的子对象不起作用)

1
this.transform.DetachChildren();

获取子对象

按照名字寻找子对象

transform.Find​方法 是可以找到失活的对象的!但GameObject相关方法不能找到

1
this.transform.Find("Cube");    //只能找到子对象,不能直接找到子对象的子对象

虽然该方法效率,比GameObject.Find()相关方法更高一些 但是该方法必须要知道父对象是谁才能找到

遍历父对象的所有子对象(不包括子对象的子对象)

包括失活的子对象,但不包括子对象的子对象

1
2
3
4
5
print(this.transform.childCount);   //包括失活的子对象,但不包括子对象的子对象
for (int i = 0; i < this.transform.childCount; i++)
{
print("子对象的名字:" + this.transform.GetChild(i).name);
}

通过索引号 去得到自己对应的子对象

通过索引号 去得到自己对应的子对象,如果编号溢出,会直接报错!
返回值 是 transform ,可以得到对应子对象的Transform实例化对象

1
this.transform.GetChild(0);

子对象的操作

判断自己的父对象是什么

要做判断的子对象.IsChildOf​(被用于判断是否为父对象的对象),一个对象 判断自己是不是另一个对象的子对象

1
2
3
4
if (son.IsChildOf(this.transform)) //返回bool
{
print("是我的子对象");
}

得到自己作为子对象的编号

1
print(son.GetSiblingIndex());

把自己设置为第一个子对象

1
son.SetAsFirstSibling();

把自己设置为最后一个子对象

1
son.SetAsLastSibling();

把自己设置为指定个儿子

如果填的数值超出范围(无论是过大还是过小)都不会报错 会直接放在最后一个位置

1
son.SetSiblingIndex(10);