【unity】(2)GameObject

时间:2024-05-08 08:06:28

GameObject类是基本的游戏对象类型,它可以用来代表场景中的任何实体。

基本属性

  1. name

    • 类型:string
    • 说明:GameObject的名称。
    • 用法:
    GameObject go = new GameObject();
    go.name = "My GameObject";
    
  2. activeSelf

    • 类型:bool
    • 说明:指示GameObject自身是否处于激活状态。
    • 用法:
    bool isActive = go.activeSelf;
    
  3. activeInHierarchy

    • 类型:bool
    • 说明:指示GameObject在整个场景中是否处于激活状态(包括父级对象的激活状态)。
    • 用法:
    bool isActiveInHierarchy = go.activeInHierarchy;
    
  4. isStatic

    • 类型:bool
    • 说明:指示GameObject是否被标记为静态对象(对于性能优化很重要)。
    • 用法:
    go.isStatic = true;
    
  5. tag

    • 类型:string
    • 说明:GameObject的标签,用于分类或查找对象。
    • 用法:
    go.tag = "Player";
    
  6. layer

    • 类型:int
    • 说明:GameObject所在的层,用于渲染和物理碰撞。
    • 用法:
    go.layer = 8;
    

实例化和查找

  1. Instantiate()

    • 说明:实例化一个GameObject
    • 用法:
    GameObject newObject = Instantiate(go);
    
  2. Destroy()

    • 说明:销毁一个GameObject
    • 用法:
    Destroy(go);
    
  3. Find()

    • 说明:查找场景中的某个GameObject
    • 用法:
    GameObject player = GameObject.Find("Player");
    
  4. FindWithTag()

    • 说明:通过标签查找场景中的某个GameObject
    • 用法:
    GameObject player = GameObject.FindWithTag("Player");
    
  5. FindGameObjectsWithTag()

    • 说明:通过标签查找场景中的所有GameObject
    • 用法:
    GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");
    

Transform

每个GameObject都有一个Transform组件,描述了其在场景中的位置、旋转和缩放:

  1. transform

    • 说明:GameObjectTransform组件。
    • 用法:
    Transform transform = go.transform;
    
  2. transform.position

    • 说明:GameObject的世界坐标。
    • 用法:
    go.transform.position = new Vector3(0, 5, 0);
    
  3. transform.rotation

    • 说明:GameObject的世界旋转。
    • 用法:
    go.transform.rotation = Quaternion.Euler(0, 90, 0);
    
  4. transform.localScale

    • 说明:GameObject的本地缩放。
    • 用法:
    go.transform.localScale = new Vector3(1, 2, 1);
    

组件操作

组件(Components)是附加到游戏对象(GameObjects)上的各种功能单元,包括渲染器(如Mesh Renderer)、物理组件(如Rigidbody)、自定义脚本等。

获取组件

使用 GetComponentGetComponents

GetComponent 方法用于从游戏对象上获取一个已经附加的组件实例。如果游戏对象上没有附加指定的组件,则返回 null

// 获取当前游戏对象上的Rigidbody组件
Rigidbody rb = GetComponent<Rigidbody>();
if (rb != null)
{
    // Rigidbody组件存在,可以对其进行操作
}

获取GameObject上的某个组件。

Rigidbody rb = go.GetComponent<Rigidbody>();

获取GameObject上的所有某类型的组件。

Rigidbody[] rbs = go.GetComponents<Rigidbody>();
使用 GetComponentInChildrenGetComponentsInChildren

这两个方法分别用来获取游戏对象或其任何子对象上的一个组件实例,或所有符合条件的组件实例数组。

// 获取当前游戏对象或其子对象上的第一个MeshRenderer组件
MeshRenderer meshRenderer = GetComponentInChildren<MeshRenderer>();

// 获取当前游戏对象及其所有子对象上的所有MeshRenderer组件
MeshRenderer[] meshRenderers = GetComponentsInChildren<MeshRenderer>();

获取GameObject的子对象上的某个组件。

Rigidbody rb = go.GetComponentInChildren<Rigidbody>();
使用 GetComponentInParentGetComponentsInParent

当你需要从当前游戏对象的父级或更高层级中获取组件时,使用这两个方法。

// 获取当前游戏对象的父级上的Collider组件
Collider collider = GetComponentInParent<Collider>();

获取GameObject的父对象上的某个组件。

Rigidbody rb = go.GetComponentInParent<Rigidbody>();

控制组件

一旦获取到了组件的引用,就可以轻松地读取或修改其公共属性和调用其方法。

修改属性
// 假设已获取到Rigidbody组件的引用rb
rb.mass = 2; // 修改质量
rb.useGravity = false; // 禁用重力影响
调用方法
// 使用Rigidbody组件的方法来添加力
rb.AddForce(Vector3.up * 500);

活动状态控制

在Unity中,SetActiveenabled是两种不同的方式来控制对象的活动状态:

GameObject.SetActive
  • 类型: bool
  • 说明: SetActive控制GameObject的整体激活状态。当GameObject被禁用时,它和它的所有子对象都会被禁用。
  • 用法:
// 启用GameObject
gameObject.SetActive(true);
// 禁用GameObject
gameObject.SetActive(false);
  • 效果:
    • 如果一个GameObject被设置为不激活(SetActive(false)),它和它的所有组件、子对象都会被禁用。
    • 无论GameObject的组件的enabled属性是true还是falseGameObject被禁用后,所有组件都停止工作。
Behaviour.enabled
  • 类型: bool
  • 说明: enabled是用于控制Behaviour类及其子类的组件(如MonoBehaviourColliderRenderer等)的活动状态。
  • 用法:
    // 启用组件
    gameObject.GetComponent<Renderer>().enabled = true;
    // 禁用组件
    gameObject.GetComponent<Renderer>().enabled = false;
    
  • 效果:
    • enabled仅影响组件本身,不影响GameObject的整体活动状态。
    • 如果组件被设置为enabled = false,它自身会停止工作,但不影响其他组件或子对象。
区别总结
  1. 范围:

    • SetActive作用于整个GameObject及其子对象。
    • enabled作用于单个组件。
  2. 影响:

    • SetActive会禁用所有组件和子对象,无论它们的enabled属性如何。
    • enabled只影响特定组件。
  3. 重启:

    • SetActive(false)SetActive(true)GameObject会完全重新初始化。
    • enabled的状态切换不会重新初始化组件。
使用示例
void Example()
{
    GameObject go = new GameObject("Example");

    // 添加一个组件
    Renderer renderer = go.AddComponent<Renderer>();

    // 使用SetActive禁用整个GameObject
    go.SetActive(false); // This will also disable renderer
    Debug.Log(renderer.enabled); // Output: False

    // 重新启用GameObject
    go.SetActive(true);
    Debug.Log(renderer.enabled); // Output: True

    // 使用enabled禁用组件
    renderer.enabled = false;
    Debug.Log(go.activeSelf); // Output: True
}

添加和移除组件

你还可以在运行时动态地添加或移除组件。

添加组件
// 向当前游戏对象添加一个Rigidbody组件
Rigidbody rb = gameObject.AddComponent<Rigidbody>();
移除组件
// 移除当前游戏对象上的Rigidbody组件
Destroy(GetComponent<Rigidbody>());

注意事项

  • 在频繁调用的方法中(如 Update)避免使用 GetComponent 和其变体,因为这些方法可能会对性能产生影响。最好在初始化时(如 StartAwake 方法中)获取并缓存所需的组件引用。
  • 当你试图获取的组件不存在时,GetComponent 会返回 null。在尝试使用获取到的组件之前,最好进行空值检查,以避免空引用异常。

使用示例

以下是一个综合示例,展示了如何使用GameObject类:

using UnityEngine;

public class GameObjectExample : MonoBehaviour
{
    void Start()
    {
        // 创建一个新的GameObject
        GameObject go = new GameObject("My GameObject");

        // 添加一个组件
        Rigidbody rb = go.AddComponent<Rigidbody>();

        // 设置位置
        go.transform.position = new Vector3(0, 5, 0);

        // 设置激活状态
        go.SetActive(true);

        // 查找标签为"Player"的GameObject
        GameObject player = GameObject.FindWithTag("Player");

        // 销毁对象
        Destroy(player, 2.0f); // 2秒后销毁
    }
}