3 GameObject

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");
}

5.6 其他次要的成员方法 有兴趣自行了解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值