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

news2024/11/24 2:25:21

【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);
    }

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/449776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单链表的实现

链表的概念与结构 链表与我们通讯录中的顺序表是不同的,顺序表的空间是连续的,像数组一样可以通过下标访问。而链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。即:链表…

数据结构笔记:二叉树的遍历与技巧

引言 本篇是最近有遇到过的一个题目,关于二叉树的遍历,正好有一些经验与技巧,所以开一篇帖子记录一下。 二叉树遍历介绍 遍历是数据结构中常见的操作,主要是将所有元素都访问一遍。对于线性结构来说,遍历分为两种&a…

RecyclerView 静态布局实现过程解析:如何构建高性能的列表

作者:maxcion Recyclerview在日常开发中所使用的控件中绝对是顶流一般的存在,想嚼它这个想法一次两次了。在网上也看了很多关于Recyclerview源码解析的文章,大佬们写的都很深刻,但是对于像我们这种储备知识不足的小白读者来说&…

前端实现端到端测试(代码版)

端到端测试框架选取 playwright 、 cypress 、 selenium 对比 cypress使用 下载 cypress npm install cypress --save-dev package.json npm run cypress:open {"scripts": {"cypress:open": "cypress open"} }使用流程 入门官方文档 npm ru…

一本通 3.4.5 最小生成树

1348:【例4-9】城市公交网建设问题 【题目描述】 有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权为在这两个城市之间修建高速公路的造价,研究后发现,这个地图有一个特点&…

SQL Server基础 第四章 select定制查询(select中的各种查询筛选条件)

本章主要介绍 select 语句查询数据的基本用法,其中包括查询指定字段信息、条件查询等。 目录 1、比较运算符、逻辑运算符 (1)查询phone大于500且不是单县的 (2)查询地址为烟台或者单县但是phone要大于666的 &#…

IMX6ull 之 HelloWorld Led点灯

一 GPIO点灯,嵌入式的helloworld 1 何为GPIO? GPIO只是一个CPU内提供的一种功能外设,CPU外部的I/O引脚会被赋予一种功能(GPIO、UART、I2C等);该功能由CPU内外设提供,具体是什么功能由IOMUX…

刷题笔记4-22

目录 1.Java:(a,b)>Math.abs(a-3)-Math.abs(b-3); 2.字符解释 3.C语言二维数组中a[i]表示ai的地址,而a[i]又可以表示为*(ai) 4.二维数组在传参时,必须给定列 5.软件开发:观察者模式 6.建…

shell脚本控制

shell脚本编程系列 处理信号 Linux利用信号与系统中的进程进行通信,通过对脚本进行编程,使其在收到特定信号时执行某些命令,从而控制shell脚本的操作。 Linux信号 shell脚本编程会遇到的最常见的Linux系统信号如下表所示: 在默…

【ros】6.ros激光雷达SLAM(建图定位)

百行业为先 ,万恶懒为首。——梁启超 文章目录 :smirk:1. 激光SLAM:blush:2. 二维激光SLAM:satisfied:3. 三维激光SLAM 😏1. 激光SLAM SLAM(同步定位与地图构建)是一种机器人感知技术,用于在未知环境中同时确定机器人…

java调用webservicer的方法

对于使用 Webservicer的方式,一般采用 Java API调用的方式。Webservicer是一个运行在浏览器中的客户端程序,它可以通过 Webservicer的接口来访问服务器上的服务。 使用 Java调用 Webservicer有两种方式: 下面是一个简单的例子: 2、…

零基础,零成本,部署一个属于你的大模型

前言 看了那么多chatGPT的文章,作为一名不精通算法的开发,也对大模型心痒痒。但想要部署自己的大模型,且不说没有算法相关的经验了,光是大模型占用的算力资源,手头的个人电脑其实也很难独立部署。就算使用算法压缩后的…

数据结构和算法学习记录——小习题-二叉树的遍历二叉搜索树

目录 二叉树的遍历 1-1 1-2 1-3 二叉搜索树 2-1 2-2 2-3 2-4 答案区 二叉树的遍历 1-1 假定只有四个结点A、B、C、D的二叉树,其前序遍历序列为ABCD,则下面哪个序列是不可能的中序遍历序列? .ABCD .ACDB .DCBA .DABC 1-2 对于…

最精简:windows环境安装tensorflow-gpu-2.10.1

Tensorflow 2.10是最后一个在本地windows上支持GPU的版本 1. 通过.whl文件方式安装2.创建anaconda虚拟环境3.安装对应的cuda与cudnn版本,local不必装cuda和cudnn4. 测试tensorflow gpu是否可用 1. 通过.whl文件方式安装 .whl文件的下载地址: tensorflow…

windows下使用vite创建vue项目

windows下使用vite创建vue项目 1 下载安装配置NodeJS1.1 下载1.2 安装1.3 配置1.4 npm镜像加速配置1.6 设置环境变量 2 Vite简单介绍3 Vite创建vue项目3.1 vite创建vue项目的命令3.2 vite创建vue项目步骤 1 下载安装配置NodeJS 1.1 下载 下载地址:https://nodejs.…

全注解下的SpringIoc 续2-bean的生命周期

spring中bean的生命周期 上一个小节梳理了一下Spring Boot的依赖注入的基本知识,今天来梳理一下spring中bean的生命周期。 下面,让我们一起看看bean在IOC容器中是怎么被创建和销毁的。 bean的生命周期大致分为四个部分: #mermaid-svg-GFXNEU…

数据分类分级 数据识别-识别日期类型数据

前面针对数据安全-数据分类分级方案设计做了分析讲解,具体内容可点击数据安全-数据分类分级方案设计,不再做赘述 上面图片是AI创作生成!如需咒语可私戳哦! 目录 前言需求日期格式代码日期类型数据对应正则表达式前言 要做数据分类分级,重要的是分类分级模版的合理性和数…

一致性 Hash 算法 及Java TreeMap 实现

1、一致性 Hash 算法原理 一致性 Hash 算法通过构建环状的 Hash 空间替线性 Hash 空间的方法解决了这个问题,整个 Hash 空间被构建成一个首位相接的环。 其具体的构造过程为: 先构造一个长度为 2^32 的一致性 Hash 环计算每个缓存服务器的 Hash 值&…

「C/C++」C++对已有的类进行扩充

博客主页:何曾参静谧的博客 文章专栏:「C/C」C/C学习 目录 相关术语一、 继承二、组合 相关术语 继承:继承父类后可以拥有父类对应的属性和方法。 组合:将类作为成员对象,基类可以直接调用派生类对应的属性和方法。 一…

MySQL_第08章_聚合函数

第08章_聚合函数 讲师:尚硅谷 - 宋红康(江湖人称:康师傅) 官网: http://www.atguigu.com 我们上一章讲到了 SQL 单行函数。实际上 SQL 函数还有一类,叫做聚合(或聚集、分组)函…