unity脚本获取物体和组件
创始人
2024-11-13 05:38:30
0

以下是关于利用脚本获取物体和组件的学习记录。

1.GameObject.Find()方法

        某些时候当我们需要在一个物体上获得其他物体就可以使用GameObject.Find()方法。该方法是通过遍历场景中的所有物体,找到指定物体名称来获取物体,但需要注意的是该方法无法找到未激活的物体。

在下面场景中有三个物体分别是Mian Camera、Directional Light、Cube。使用GameObject.Find()方法获取这三个物体。

先创建一个Cube,再创建一个脚本,将脚本挂载到Cube身上。

 

using System.Collections; using System.Collections.Generic; using UnityEngine;  public class GetcomponentTest : MonoBehaviour {     //声明GameObject类型的变量     GameObject ObjectCube;     GameObject ObjectCamera;     GameObject ObjectLight;     void Start()     {        //通过GameObject.Find()方法获取立方体        ObjectCube =GameObject.Find("Cube");         //通过GameObject.Find()方法获取主摄像机         ObjectCamera = GameObject.Find("Main Camera");         //通过GameObject.Find()方法获取主光源         ObjectLight = GameObject.Find("Directional Light");         Debug.Log("获取到的物体:"+ObjectCube.name+","+ObjectCamera.name+","+ObjectLight.name);      } } 
2.GameObject.FindGameObjectWithTag()方法 

        通过给物体指定标签,利用物体标签查找物体。给Cube指定一个Player的标签,通过该方法来获取它。

  

using System.Collections; using System.Collections.Generic; using UnityEngine;  public class GetcomponentTest : MonoBehaviour {     //声明GameObject类型的变量     GameObject objectPlayer;     void Start()     {         //通过GameObject.FindGameObjectWithTag()方法获取标签为"Player"的物体         objectPlayer = GameObject.FindGameObjectWithTag("Player");         Debug.Log("获取到的物体:"+objectPlayer.name);      } } 
3.GameObject.FindGameObjectsWithTag()方法  

        该方法同样是通标签查找物体,但它的返回值是一个数组。在场景中多添加几个物体用于测试,并给它们指定“Enemy”标签。

 

using System.Collections; using System.Collections.Generic; using UnityEngine;  public class GetcomponentTest : MonoBehaviour {     //声明GameObject类型的数组     GameObject[] objects;     void Start()     {         //通过GameObject.FindGameObjectsWithTag()方法获取标签为"Enemy"的物体         objects = GameObject.FindGameObjectsWithTag("Enemy");         foreach (GameObject obj in objects)         {             Debug.Log("数组获取到的物体:" + obj.name);         }              } } 
4.通过“父子关系”查找物体 

        组成“父子关系”的物体会形成树形结构,拥有父子节点。在unity中,“父子关系”的表达是Transform组件的职责。因此我们可以利用transform的属性来查找父节点和子节点物体。

        1.transform.GetChild()方法

                该方法是根据子物体的序号查找子物体,子物体的序号就是它在同一级的所有子物体中排第几个,也就是在Hierarchy面板中看到的顺序。搭建“父子关系”物体,将脚本挂载在父物体身上用来测试。

using System.Collections; using System.Collections.Generic; using UnityEngine;  public class GetcomponentTest : MonoBehaviour {     Transform objChild0;     Transform objChild1;     Transform objChild2;     void Start()     {         objChild0=transform.GetChild(0);         objChild1=transform.GetChild(1);         objChild2=transform.GetChild(2);         Debug.Log("子物体名称:"+objChild0.name+","+objChild1.name+","+objChild2.name);     } }
        2.transform.parent方法 

                该方法用来获取子物体的父物体,它没有参数,但可以给它赋值,但赋值为null时子物体会脱离“父子关系”,也就是子物体的父物体为空。

                这里将脚本挂载在Cylinder(圆柱体)上,查找到它的父物体为Cube。

 

using System.Collections; using System.Collections.Generic; using UnityEngine;  public class GetcomponentTest : MonoBehaviour {     Transform objParent;     void Start()     {         objParent=transform.parent;         Debug.Log("父物体名称:"+objParent.name);     } } 
5.GetComponent()方法

        先创建一个Cube,再创建一个脚本,将脚本挂载到Cube身上。

 

这里我获取的是Cube身上的BoxCollider(立方体的碰撞器)。当脚本挂载在完成挂载后,会成为一个实例化的类,也就是一个对象,而代码上的gameObject是当前脚本的一个属性,指的是当前被挂载的物体。所以这里是先获得Cube物体,再通过物体获取它身上的组件。

当然在unity中也可以不需要先获取游戏物体,在同一个物体身上,从任意一个组件出发都可以获取其他组件。

using System.Collections; using System.Collections.Generic; using UnityEngine;  public class GetcomponentTest : MonoBehaviour {     //声明一个类型为BoxCollider的变量     //用于保存获取到的组件     BoxCollider collider;     void Start()     {         //通过物体的GetComponent()方法获取BoxCollider组件         collider = gameObject.GetComponent();         //通过transform组件获取BoxCollider组件         collider=transform.GetComponent();         //通过MeshRenderer获取BoxCollider组件         collider=GetComponent().GetComponent();          }
6.GetComponents()方法

        当一个物体包含多个同类型的组件时,可以通过GetComponents()方法获取所有同类型的组件。给Cube加上三个BoxCollider组件用来测试,由于Get Components()方法获取到的数据类型为数组,所以需要声明一个数组变量用于储存。

using System.Collections; using System.Collections.Generic; using UnityEngine;  public class GetcomponentTest : MonoBehaviour {     //声明一个BoxCollider类型的数组,用于存储获取到的组件。     BoxCollider[] boxColliders = null;     void Start()     {             //通过GetComponents()方法获取同一类型的所有组件         boxColliders = GetComponents();         Debug.Log("共有"+boxColliders.Length+"个BoxCollider组件");     }

以上就是自己在学习过程中遇到过的使用方法,使用脚本获取物体和组件的方法还有很多,欢迎各位补充学习。上述内容如有错误还请指正。

相关内容

热门资讯

透视辅助!新荣耀辅助安装(辅助... 透视辅助!新荣耀辅助安装(辅助挂)真是是有挂(详细辅助德州论坛)1、用户打开应用后不用登录就可以直接...
透视辅助!小程序四川血战辅助(... 透视辅助!小程序四川血战辅助(辅助挂)总是真的是有挂(详细辅助新2025教程);小薇(透视辅助)致您...
透视辅助!斗棋辅助脚本视频(辅... 透视辅助!斗棋辅助脚本视频(辅助挂)切实是真的有挂(详细辅助科技教程)1、下载好斗棋辅助脚本视频辅助...
透视辅助!三哥玩摆头挂(辅助挂... 透视辅助!三哥玩摆头挂(辅助挂)本来是有挂(详细辅助第三方教程)1、上手简单,内置详细流程视频教学,...
透视辅助!边锋干瞪眼技巧(辅助... 透视辅助!边锋干瞪眼技巧(辅助挂)一直有挂(详细辅助透明挂教程);在进入边锋干瞪眼技巧辅助挂后,参与...
透视辅助!盛世辅助软件怎么样(... 透视辅助!盛世辅助软件怎么样(辅助挂)好像是有挂(详细辅助必赢方法)1、不需要AI权限,帮助你快速的...
透视辅助!微乐家乡麻辣自建房辅... 透视辅助!微乐家乡麻辣自建房辅助app(辅助挂)总是是真的有挂(详细辅助靠谱教程)1、这是跨平台的微...
透视辅助!微信小程序微乐辅助免... 透视辅助!微信小程序微乐辅助免费(辅助挂)其实是有挂(详细辅助科技教程)1、操作简单,无需注册,只需...
透视辅助!欢聚水鱼天下辅助(辅... 透视辅助!欢聚水鱼天下辅助(辅助挂)一贯是真的有挂(详细辅助爆料教程)1、进入游戏-大厅左侧-新手福...
透视辅助!广丰中至510k辅助... 透视辅助!广丰中至510k辅助(辅助挂)一贯有挂(详细辅助细节方法)运广丰中至510k辅助辅助工具,...