unity脚本获取物体和组件

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

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<BoxCollider>();
        //通过transform组件获取BoxCollider组件
        collider=transform.GetComponent<BoxCollider>();
        //通过MeshRenderer获取BoxCollider组件
        collider=GetComponent<MeshRenderer>().GetComponent<BoxCollider>();
    
    }
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<BoxCollider>();
        Debug.Log("共有"+boxColliders.Length+"个BoxCollider组件");
    }

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

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity中,我们可以使用GetComponent方法来获取其他游戏物体上的组件。当我们需要和其他物体进行交互或控制时,这个方法非常有用。 首先,我们需要确保我们有对应游戏物体的引用。这可以通过在脚本中声明一个公共变量,并通过检查器将相应的游戏物体拖入来完成。例如,我们可以声明一个公共的Rigidbody2D变量: public Rigidbody2D targetRigidbody; 然后,我们可以通过在代码中使用GetComponent方法来获取物体上的Rigidbody2D组件。例如,在某个方法中,我们可以使用以下代码来获得targetRigidbody上的Rigidbody2D组件: Rigidbody2D rb = targetRigidbody.GetComponent<Rigidbody2D>(); 现在,我们可以使用rb变量来操作targetRigidbody上的Rigidbody2D组件。例如,我们可以通过设置速度来移动该物体: rb.velocity = new Vector2(1, 0); 通过GetComponent方法,我们可以轻松地获取其他物体上的各种组件,如碰撞器、动画控制器等。这样,我们就可以与其他物体进行交互,实现各种游戏功能。 需要注意的是,当我们使用GetComponent方法来获取其他物体上的组件时,确保目标物体上确实有所需的组件,否则会返回空引用错误。另外,如果我们需要频繁地获取同一个组件,最好在Start或Awake方法中将其缓存起来,以避免每次都重新获取。这样可以提高性能和效率。 通过使用GetComponent方法,我们可以轻松地在Unity获取其他物体上的组件,从而实现更丰富的交互和控制效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值