【Unity入门】17.脚本访问父子结点

【Unity入门】脚本访问父子结点

    大家好,我是Lampard~~

    欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 

(一)父级节点

(1)访问父级节点

    父子关系我们并不陌生,在cocos中常用node:getParent()来获取父级,node:getChild()来获取子级结点,那在unity中是怎么调用的呢?

    在unity中比较奇怪,它的父子关系是记录在transform组件上的(这可能也是transform不可被删除的原因?),因此我们获得父节点可以通过下面的代码

Transform parentTransform = this.transform.parent;

    值得注意的是,通过Transform获得的父级,也是Transform类型的组件,如果我想要访问父级结点这个对象,是需要多加一步操作:

Transform parentTransform = this.transform.parent;
GameObject parent = parentTransform.gameObject;

(2)修改父级结点

    我们可以访问到父级结点,还可以通过tranform.SetParent修改物体的父子关系,比如当前的父子关系如下:

    我们创建一个船新的ParentLogic脚本挂载在BBB物体上

    首先在start中打印父类的名字,然后在update监听鼠标点击动作,点击时就把BBB结点的父类切换至CCC,代码如下:

    void Start()
    {
        Transform parentTransform = this.transform.parent;
        GameObject parent = parentTransform.gameObject;
        Debug.Log("父类的名称是:" + parent.name);
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            GameObject newParent = GameObject.Find("CCC");
            this.transform.SetParent(newParent.transform);
        }
    }

    可以看到,一开始父类的名字是AAA,执行点击后,父类就变成CCC了

(二)子节点

(1)遍历所有子节点foreach

    如果我们想遍历所有的子节点,我们可以通过foreach这个方法实现,它的语法如下:

foreach(Transform child in transform)
{
    // DO SOMETHING
}

    其中child是transform组件下面的所有子transform组件,因此我们可以通过这样的代码来访问所有子节点的名称

foreach(Transform child in transform)
{
    GameObject childObj = child.gameObject;
    Debug.Log("子物体名称为:" + childObj.name)
}

    比如现在AAA结点下面有BBB,CCC,DDD,子结点,其中DDD子节点有一个EEE孙子结点,看看打印效果怎么样

     代码如下:

    void Start()
    {
        GameObject AAA = GameObject.Find("AAA");
        foreach (Transform child in AAA.transform)
        {
            GameObject childObj = child.gameObject;
            Debug.Log("子物体名称为:" + childObj.name);
        }
    }

     可以看到,打印的结果把三个子节点都打出来了,但是孙子结点EEE并没有,所以如果我们想获得子节点中的某一个,我们可以在foreach的时候加一个If name == XXX 的判断

(2)直接精准查找某一个子节点

    之前我们不建议使用GameObject.Find来寻找物体,一方面容易重名,另一方面比较耗,那如果我们想精准找到结点下的某个子节点,就只能foreach去寻找了吗?

    unity的transform组件给我们提供了一个Find方法,和GameObject的FInd一样,需要传入物体的名字或者路径,好处就是,它是精准在它的子节点之间寻找,这样无论从损耗和精准性都强很多

    void Start()
    {
        GameObject AAA = GameObject.Find("AAA");
        Transform BBB =  AAA.transform.Find("BBB");
        Debug.Log(BBB.gameObject.name);
    }

好啦今天就到这里,谢谢各位感谢阅读!!!
点赞,关注!!!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lampard杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值