Unity用脚本获取物体和组件(下)

简介: Unity用脚本获取物体和组件(下)

一、应用父子关系

1、通过父子关系获取物体

仔细观察Hierarchy窗口会发现,其实拥有大量“父子关系”的物体已经构成了树形结构。在Unity中,“父子关系”的表达是Transform组件的职责。下表列出了在父子节点之间查找物体的相关方法和属性

                                          Transform组件中与查找物体相关的方法

方法名 用途       参数和返回值
transform.Find 在“父子关系树”中沿给定的路径查找物体的Transform组件

参数:以字符串表示一个路径。与文件路径类似,可以通过给定的路径信息,灵活找到任意其他物体。

返回值:找到物体的Transform组件。如果没找到,返回null。

transform.GetChild 根据子物体的序号查找子物体

参数:一个整数,从0开始,表示要查找的子物体的序号。子物体的序号就是它在同一级的所有子物体中排第几个,也是Hierarchy窗口中子物体的顺序。

返回值:返回该子物体,如果下标超出范围则返回null

transform.GetSiblingIndex 获得该物体在兄弟节点之间的序号

参数:无

返回值:序号。获得本物体在兄弟物体之间的序号

transform.IsChildeOf 判断是否是另一个物体的子物体

参数:某个其他物体的Transform组件,不能为null

返回值:如果参数指定的物体是本物体的父物体,则返回true,否则返回false

 

                                        Transform组件中与查找物体相关的属性

属性名称 含义与详细说明
transform.parent

获取该物体的父物体。

如果对它赋值,可以直接改变本物体的父物体,例如赋值为null代表将本物体放在最高层。

transform.root

沿着本物体的父物体一直向上查找,获取最上一级的父物体

transform.childCount

获取该物体的子物体总数,不包含子物体的子物体。

与transform.GetChild()方法结合使用可以用来遍历所有子物体。

2、通过父子路径获取物体

通过路径,可以一次移动很多步。

查找物体的路径与操作系统的文件路径类似。当需要指明下一级节点时,就写出该节点的名称。如果还要继续指明下一级,就加上斜杠“/”分隔。如果要引用上一级节点,使用两个英文句号“..”即可。这样一来,理论上从一个物体出发就可以获取到场景中任意一个节点

3、一些有用的方法

 

方法 用途 参数和返回值
GetComponentInChildren 从所有子物体中查找某种组件

参数:需要用泛型指定查找的类型

返回值:找到的第一个组件

GetComponentsInChildren 从所有子物体中查找所有某种组件

参数:需要用泛型指定查找的类型

返回值:包含所有该类型组件的数组

GetComponentInParent 从父物体中查找某种组件

参数:需要用泛型指定查找的类型

返回值:找到的第一个组件

GetComponentsInParent 从父物体中查找所有某种组件

参数:需要用泛型指定查找的类型

返回值:包含所有该类型组件的数组

二、利用公开变量引用物体和组件

举例如下

using UnityEngine;
public calss TestGetTransform : MonoBehaviour
{
   public GameObject other;
   public Transform otherTrans;
   public MeshFilter otherMesh;
   public Rigidbody otherRigid;
   void Start()
   {
   //可以任意使用前面的变量
   }
}

在Inspector界面,将相应的对象或者组件拖曳到对应框框内,就可以了。这种方式非常直观,而且可以用组件类型作为限制,防止拖入错误类型的物体。

总结:

获取物体和组件的方式有以下几种:

  • 通过名称或标签,找到任意未禁用的物体
  • 通过父子关系,从一个物体出发,可以沿路找到任意物体
  • 只要获得了某个游戏物体或该物体上的任意组件,就可以得到所有其他组件,也可以通过任意组件获得物体本身
  • 可以遍历某个物体下一级的所有子物体
  • 可以用公开变量的方式,在编译器里拖曳选择物体


相关文章
|
10天前
|
图形学
Unity 获取鼠标位置下的UGUI或3D物体
本文总结了两种检测方法,分别用于UGUI和3D物体的检测。第一种方法`GetOverUIobj`专门用于检测鼠标悬停的UGUI元素,通过`GraphicRaycaster`实现。第二种方法`GetOverWordGameObject`则同时适用于UI和3D物体检测,利用`PhysicsRaycaster`进行射线检测。两者均返回悬停对象或null。
|
10天前
|
图形学
unity 物体震动
在Unity中实现物体震动效果,主要通过改变物体的位置、旋转或缩放属性来模拟震动。以下是位置震动的实现原理及代码示例:通过随机生成微小偏移量并累加到物体位置上,在短时间内不断改变位置产生震动效果。生成随机偏移,并结合时间控制持续震动。
|
10天前
|
前端开发 图形学
unity UGUI跟随3D物体的坐标转换
在 Unity 中实现 UGUI 元素跟随 3D 物体,关键是将 3D 物体的世界坐标转换为屏幕或画布坐标。通过 Camera.WorldToScreenPoint 方法,可将 3D 物体位置映射到屏幕上,再更新 UGUI 元素的位置。代码示例展示了如何使用该方法,使 UGUI 图像跟随 3D 模型,并提供文字显示、图像和线条的显示/隐藏功能。
|
10天前
|
存储 图形学 索引
unity 使物体跟随路径点自动移动位置
在Unity中,物体沿路径点自动移动的核心原理是通过预设路径点,控制物体依次移动。路径点可用空对象或三维向量数组定义,并按顺序存储。移动时,计算当前位置与下一个路径点的向量差以确定方向,使用`Vector3.MoveTowards`逐步靠近目标点。代码实现包括路径点设置、移动控制及插值计算,确保物体平滑移动和旋转。
|
10天前
|
图形学
Unity 射线移动物体Ray
在Unity中,通过射线检测实现3D物体的拖拽和移动。射线由起点和方向组成,使用`Physics.Raycast`检测与物体的交点。点击物体时,记录位置偏移量,拖动过程中更新物体位置。代码包括基本拖拽和上下拖动功能,适用于正交摄像机场景。测试时为物体设置特定标签(如"JQR")以便区分和操作。 示例代码展示了如何通过鼠标事件控制物体移动,并结合层级掩码优化射线检测。具体实现包括:点击选中物体、拖动更新位置、释放鼠标取消选择。此外,提供了上下拖动的额外功能,通过按键切换模式。
|
10天前
|
图形学 开发者
unity 从工具栏拖动生成物体
在 Unity 中实现从工具栏拖动生成物体的功能,基于编辑器扩展、事件系统和预制体实例化。通过自定义编辑器窗口、处理鼠标事件(按下、移动、释放)及使用 Instantiate 方法,可实现拖动并生成预制体物体。代码示例展示了如何检测鼠标事件并在指定位置实例化物体。
|
11天前
|
图形学 开发者
Unity编辑器脚本(添加/删除)碰撞盒
这段代码提供了两个Unity编辑器工具,用于批量处理模型的碰撞盒。一是“一键添加所有碰撞盒”,通过选择模型的父物体,自动为其子物体添加`MeshCollider`。二是“一键清理所有Collider碰撞盒”,同样选择父物体后,递归删除子物体上的`BoxCollider`组件。两者均通过Unity的菜单项实现便捷操作,方便开发者快速调整场景中的物理属性。
|
5月前
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
304 3
|
6月前
|
前端开发 图形学
Unity精华☀️UI和物体可见性的判断方法
Unity精华☀️UI和物体可见性的判断方法
|
6月前
|
图形学
小功能⭐️获取Unity游戏物体上,所挂载组件的名称
小功能⭐️获取Unity游戏物体上,所挂载组件的名称