GameObject类是基本的游戏对象类型,它可以用来代表场景中的任何实体。
基本属性
-  name- 类型:string
- 说明:GameObject的名称。
- 用法:
 GameObject go = new GameObject(); go.name = "My GameObject";
- 类型:
-  activeSelf- 类型:bool
- 说明:指示GameObject自身是否处于激活状态。
- 用法:
 bool isActive = go.activeSelf;
- 类型:
-  activeInHierarchy- 类型:bool
- 说明:指示GameObject在整个场景中是否处于激活状态(包括父级对象的激活状态)。
- 用法:
 bool isActiveInHierarchy = go.activeInHierarchy;
- 类型:
-  isStatic- 类型:bool
- 说明:指示GameObject是否被标记为静态对象(对于性能优化很重要)。
- 用法:
 go.isStatic = true;
- 类型:
-  tag- 类型:string
- 说明:GameObject的标签,用于分类或查找对象。
- 用法:
 go.tag = "Player";
- 类型:
-  layer- 类型:int
- 说明:GameObject所在的层,用于渲染和物理碰撞。
- 用法:
 go.layer = 8;
- 类型:
实例化和查找
-  Instantiate()- 说明:实例化一个GameObject。
- 用法:
 GameObject newObject = Instantiate(go);
- 说明:实例化一个
-  Destroy()- 说明:销毁一个GameObject。
- 用法:
 Destroy(go);
- 说明:销毁一个
-  Find()- 说明:查找场景中的某个GameObject。
- 用法:
 GameObject player = GameObject.Find("Player");
- 说明:查找场景中的某个
-  FindWithTag()- 说明:通过标签查找场景中的某个GameObject。
- 用法:
 GameObject player = GameObject.FindWithTag("Player");
- 说明:通过标签查找场景中的某个
-  FindGameObjectsWithTag()- 说明:通过标签查找场景中的所有GameObject。
- 用法:
 GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");
- 说明:通过标签查找场景中的所有
Transform
每个GameObject都有一个Transform组件,描述了其在场景中的位置、旋转和缩放:
-  transform- 说明:GameObject的Transform组件。
- 用法:
 Transform transform = go.transform;
- 说明:
-  transform.position- 说明:GameObject的世界坐标。
- 用法:
 go.transform.position = new Vector3(0, 5, 0);
- 说明:
-  transform.rotation- 说明:GameObject的世界旋转。
- 用法:
 go.transform.rotation = Quaternion.Euler(0, 90, 0);
- 说明:
-  transform.localScale- 说明:GameObject的本地缩放。
- 用法:
 go.transform.localScale = new Vector3(1, 2, 1);
- 说明:
组件操作
组件(Components)是附加到游戏对象(GameObjects)上的各种功能单元,包括渲染器(如Mesh Renderer)、物理组件(如Rigidbody)、自定义脚本等。
获取组件
使用 GetComponent和GetComponents
 
GetComponent 方法用于从游戏对象上获取一个已经附加的组件实例。如果游戏对象上没有附加指定的组件,则返回 null。
// 获取当前游戏对象上的Rigidbody组件
Rigidbody rb = GetComponent<Rigidbody>();
if (rb != null)
{// Rigidbody组件存在,可以对其进行操作
}
获取GameObject上的某个组件。
Rigidbody rb = go.GetComponent<Rigidbody>();
获取GameObject上的所有某类型的组件。
Rigidbody[] rbs = go.GetComponents<Rigidbody>();
使用 GetComponentInChildren 和 GetComponentsInChildren
 
这两个方法分别用来获取游戏对象或其任何子对象上的一个组件实例,或所有符合条件的组件实例数组。
// 获取当前游戏对象或其子对象上的第一个MeshRenderer组件
MeshRenderer meshRenderer = GetComponentInChildren<MeshRenderer>();// 获取当前游戏对象及其所有子对象上的所有MeshRenderer组件
MeshRenderer[] meshRenderers = GetComponentsInChildren<MeshRenderer>();
获取GameObject的子对象上的某个组件。
Rigidbody rb = go.GetComponentInChildren<Rigidbody>();
使用 GetComponentInParent 和 GetComponentsInParent
 
当你需要从当前游戏对象的父级或更高层级中获取组件时,使用这两个方法。
// 获取当前游戏对象的父级上的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中,SetActive和enabled是两种不同的方式来控制对象的活动状态:
GameObject.SetActive
 
- 类型: bool
- 说明: SetActive控制GameObject的整体激活状态。当GameObject被禁用时,它和它的所有子对象都会被禁用。
- 用法:
// 启用GameObject
gameObject.SetActive(true);
// 禁用GameObject
gameObject.SetActive(false);
- 效果: - 如果一个GameObject被设置为不激活(SetActive(false)),它和它的所有组件、子对象都会被禁用。
- 无论GameObject的组件的enabled属性是true还是false,GameObject被禁用后,所有组件都停止工作。
 
- 如果一个
Behaviour.enabled
 
- 类型: bool
- 说明: enabled是用于控制Behaviour类及其子类的组件(如MonoBehaviour、Collider、Renderer等)的活动状态。
- 用法:// 启用组件 gameObject.GetComponent<Renderer>().enabled = true; // 禁用组件 gameObject.GetComponent<Renderer>().enabled = false;
- 效果: - enabled仅影响组件本身,不影响- GameObject的整体活动状态。
- 如果组件被设置为enabled = false,它自身会停止工作,但不影响其他组件或子对象。
 
区别总结
-  范围: - SetActive作用于整个- GameObject及其子对象。
- enabled作用于单个组件。
 
-  影响: - SetActive会禁用所有组件和子对象,无论它们的- enabled属性如何。
- enabled只影响特定组件。
 
-  重启: - SetActive(false)再- SetActive(true),- GameObject会完全重新初始化。
- enabled的状态切换不会重新初始化组件。
 
使用示例
void Example()
{GameObject go = new GameObject("Example");// 添加一个组件Renderer renderer = go.AddComponent<Renderer>();// 使用SetActive禁用整个GameObjectgo.SetActive(false); // This will also disable rendererDebug.Log(renderer.enabled); // Output: False// 重新启用GameObjectgo.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和其变体,因为这些方法可能会对性能产生影响。最好在初始化时(如Start或Awake方法中)获取并缓存所需的组件引用。
- 当你试图获取的组件不存在时,GetComponent会返回null。在尝试使用获取到的组件之前,最好进行空值检查,以避免空引用异常。
使用示例
以下是一个综合示例,展示了如何使用GameObject类:
using UnityEngine;public class GameObjectExample : MonoBehaviour
{void Start(){// 创建一个新的GameObjectGameObject go = new GameObject("My GameObject");// 添加一个组件Rigidbody rb = go.AddComponent<Rigidbody>();// 设置位置go.transform.position = new Vector3(0, 5, 0);// 设置激活状态go.SetActive(true);// 查找标签为"Player"的GameObjectGameObject player = GameObject.FindWithTag("Player");// 销毁对象Destroy(player, 2.0f); // 2秒后销毁}
}