1 GameObject 概念
Unity 中,GameObject 是游戏中所有对象的基础单元。几乎所有的可见对象(如角色、环境、道具)和不可见对象(如逻辑管理器、音频源)都可以表示为一个 GameObject。
GameObject 是一个容器,本身没有具体的功能,可以通过附加各种组件(Component)赋予特定的功能和行为。例如:Transform 组件可以控制位置、旋转、缩放;MeshRenderer 组件可以让对象在屏幕上可见。
GameObject 可以组成父子关系,而子对象的 Transform 会受到父对象的影响。
2 GameObject 创建
2.1 在Unity中手动创建
直接在 Hierarchy 窗口中 鼠标右键 空白处,可以生成空的 GameObject 对象 或者 具有特定功能的对象(“Cube”、“Camera”等)。
2.2 通过C#脚本直接创建
public class Test : MonoBehaviour
{
void Start()
{
// 创建一个新的 GameObject,并命名为 "MyGameObject"
GameObject myObject = new GameObject("MyGameObject");
}
}
运行游戏时会自动生成 MyGameObject
2.3 通过C#脚本实例化预制件
public class Test : MonoBehaviour
{
void Start()
{
// 从 Resources/Prefabs 文件夹中加载名为 "MyPrefab" 的预制件
GameObject obj = Resources.Load<GameObject>("Prefabs/MyPrefab");
// 实例化预制件,并赋值给 obj 变量
GameObject instance = Instantiate(obj);
}
}
3 GameObject 常用的成员变量
3.1 name 名字
-
GameObject 的名称,用于识别对象。
-
类型string
public class Test : MonoBehaviour
{
void Start()
{
// 输出 该脚本 挂载的对象的名字
print(this.gameObject.name); // 输出 "Main Camera"
// 修改 该脚本 挂载的对象的名字
this.gameObject.name = "幸食喵";
}
}
3.2 tag 标签
-
用于标记GameObject。然后可以通过该标记在场景中快速查找对象。
-
类型string
-
常用在脚本中用 GameObject.FindWithTag() 来查找特定对象。
public class Test : MonoBehaviour
{
public GameObject obj; //编辑器内拖入 Cube 对象
void Start()
{
print(obj.tag); //输出"Untagged"
obj.tag = "Player";
print(obj.tag); //输出"Player"
GameObject player = GameObject.FindWithTag("Player");
print(player.name); //输出"Cube"
}
}
3.3 layer 层级
-
表示GameObject 所在的层,用于控制渲染、碰撞等操作。
-
类型int
-
通过 LayerMask 可以过滤特定层的对象。
print(obj.layer); //默认输出 0
print(this.gameObject.layer); //默认输出 0
3.4 activeSelf 对象是否激活
-
表示GameObject是否激活。
-
类型bool
-
通过SetActive控制该状态
//是否激活
print(obj.activeSelf);
//修改激活(失活)状态
obj.SetActive(false);
3.5 isStatic 是否是静态
-
GameObject 被标记为静态时,使 Unity 能够对该对象进行各种优化,例如在渲染、物理计算和导航方面。
-
类型bool
-
可以直接在编辑器勾选,也可以脚本修改。
public class Test : MonoBehaviour
{
public GameObject obj;
void Start()
{
print(obj.isStatic);
obj.isStatic = true;
print(obj.isStatic);
}
}
3.6 transform
-
所有 GameObject 都有一个 Transform 组件,控制其位置、旋转和缩放。
-
类型Transform
public class Test : MonoBehaviour
{
public GameObject obj;
void Start()
{
print(this.transform.position);
print(this.gameObject.transform.position); //等价上面一句
print("====");
print(obj.transform); //输出 Gameobject 的名称以及 该成员变量的类型
print(obj.transform.position);
}
}
4 GameObject 静态方法
4.1 CreatePrimitive(PrimitiveType type) 创建自带的几何体
public class Test : MonoBehaviour //挂载在 Test 对象上
{
public GameObject obj;
void Start()
{
//PrimitiveType包括Cube、Sphere、Capsule、Cylinder、Plane、Quad
obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
}
}
4.2 Find(string tag) 查找对象
-
通过对象名查找GameObject
-
查找效率比较低下
-
找到对象返回GameObject,未找到返回null
public class Test : MonoBehaviour
{
void Start()
{
print(GameObject.Find("Sphere"));
print(GameObject.Find("Cube"));
}
}
4.3 FindGameObjectWithTag(string tag) 通过标签查找对象
public class Test : MonoBehaviour
{
void Start()
{
GameObject obj = GameObject.FindGameObjectWithTag("Tag1");
//GameObject.FindGameObjectWithTag() 等价于 GameObject.FindWithTag()
if (obj != null)
{
print(obj.name);
}
else
{
print("根据tag没有找到对应对象");
}
}
}
-
两种找单个对象的共同点:无法找到失活的对象的,只能找到激活的对象。
-
若要得到某一个单个对象:
1.是public从外部面板拖 进行关联
2.通过API去找 -
查找多个对象
找多个对象的API 只能是通过tag去查找
//查找多个 FindGameObjectsWithTag()
GameObject[] objs = GameObject.FindGameObjectsWithTag("Tag1");
print("找到指定对象的个数 = " + objs.Length);
4.4 Instantiate(Object obj) 复制一个对象生成实例
public class Test : MonoBehaviour
{
public GameObject obj;
void Start()
{
obj = GameObject.Find("Cube");
GameObject obj2 = Instantiate(obj);
}
}
4.5 Destroy(Object obj),DestroyImmediate(Object obj) 销毁对象
//Destroy方法
//不会马上移除对象 只是给这个对象加了一个移除标识
//一般情况下 它会在下一帧时把这个对象移除并从内存中移除
//没有特殊需求的话建议使用Destroy方法 因为该方法是异步的 可以降低卡顿几率
GameObject.Destroy(obj1); //立即销毁对象
GameObject.Destroy(obj2, 2.0f); //2 秒后销毁对象
//DestroyImmediate方法
//就是立即把对象 从内存中移除了
GameObject.DestroyImmediate(obj3); //立即销毁对象
4.6 GameObject.DontDestroyOnLoad(GameObject obj)
-
防止 GameObject 在加载新场景时被销毁。
-
常用于保存玩家数据、音乐播放器等需要在多个场景中保持一致的对象。
//使自己依附的 GameObject 对象 过场景时不被删除
GameObject.DontDestroyOnLoad(this.gameObject);
//如果继承 MonoBehavior 基类也可以直接写成:
DontDestroyOnLoad(this.gameObject);
5 GameObject 成员方法
5.1 AddComponent<T>()
-
向对象添加一个组件。
gameObject.AddComponent<Rigidbody>();
-
如果想要动态的添加继承MonoBehavior的脚本 在某一个对象上
//Test 是继承 MonoBehavior 的脚本名称
obj.AddComponent(typeof(Test)) as Test;
//或者直接使用泛型
obj.AddComponent<Test>();
5.2 GetComponent<T>()
-
获取添加在对象上的组件。
Rigidbody rb = gameObject.GetComponent<Rigidbody>();
5.3 GetComponents<T>()
-
获取所有附加在对象上的指定类型的组件。
Collider[] colliders = gameObject.GetComponents<Collider>();
5.4 SetActive(bool) 设置激活失活
obj.SetActive(false); // 失活游戏对象
obj.SetActive(true); // 激活游戏对象
//判断是否激活
print(obj.activeSelf);
5.5 CompareTag(string tagName) 标签比较
-
检查游戏对象是否具有特定的标签(比直接使用 tag 属性更高效)。
if(this.gameObject.CompareTag("Player"))
{
print("对象的标签 是 Player");
}
if(this.gameObject.tag == "Player")
{
print("对象的标签 是 Player");
}