对象树结构

实际开发中,游戏场景中的各种游戏对象,经常是嵌套的。比如2DRPG游戏中主角需要实现换装,那么在贴图显示的部分,除了角色素体,还需要为各种装备留出插槽,表现在Unity编辑器中,就是一个嵌套成树形结构的游戏对象。其实这种树形结构在传统GUI软件中也非常常见,HTML就是典型的例子。我们知道在前端领域,有JQuery这种神器,能够花式操作HTML的DOM树。Unity中,也提供了一系列API,能够实现对游戏对象树结构的增删改查。

Unity中,GameObject本身是没有嵌套关系的,游戏对象的嵌套关系通过Transform组件来表达,对游戏对象树的操作,也是围绕Transform组件展开的。

查找子节点

transform.Find()可以用来查找一个子节点。

public Transform Find(string n);
  • n:游戏对象名,可以是带/的形式,表示从对象的树结构路径
ammo = gun.transform.Find("magazine/ammo");

遍历子节点

Transform本身是可迭代的,我们直接遍历一个Transform即可遍历该组件的子节点了。

foreach (Transform trans in this.transform)
{
    Debug.Log(trans.gameObject.name);
}

获取和设置父节点

有时我们需要改变一个游戏对象的父节点,这可以通过修改tranform.parent实现。

例子代码:

Transform cube1Trans = this.transform.Find("Child1");
Transform cube2Trans = this.transform.Find("Child2");
cube2Trans.parent = cube1Trans;

上面代码中,我们将Child2变更为了Child1的子节点。

兄弟节点相关操作

对于同一层级的游戏对象,我们transform.GetSiblingIndex()能够获取当前节点对象在所属层级的序号。

public int GetSiblingIndex();

同理,transform.SetSiblingIndex()能够起到设置当前节点对象在层级中顺序的作用。

public void SetSiblingIndex(int index);

transform.SetAsFirstSibling()transform.SetAsLastSibling()能够更直接的修改节点对象的顺序,将当前节点对象置于第一个位置或是最后一个位置。

public void SetAsFirstSibling();
public void SetAsLastSibling();
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。