Unity脚本API—GameObject游戏对象、Object 对象

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// GameObject 游戏对象
/// </summary>
public class GameObjectDemo : MonoBehaviour
{
    private void OnGUI()
    {
        //在场景中物体激活状态(物体实际激活状态)
        //this.gameObject.activeInHierarchy;

        //物体自身激活状态(物体在Inspector面板中的状态)
        //this.gameObject.activeSelf

        //设置物体启用/禁用
        //this.gameObject.SetActive();

        if (GUILayout.Button("添加光源")) 
        {
            //this.gameObject.AddComponent<Light>();
            //创建物体
            GameObject lightGO= new GameObject();
            //添加组件
            Light light = lightGO.AddComponent<Light>();    
            light.color = Color.red;
            light.type = LightType.Point;
        }

        //在场景中根据名称查找物体(慎用)
        //GameObject.Find("游戏对象名称");

        //获取所有使用该标签的物体
        GameObject[] allEnemy = GameObject.FindGameObjectsWithTag("Enemy");
        foreach (GameObject enemy in allEnemy)
        {
            Debug.Log("Enemy"+enemy.name);
        }
          
        //获取使用该标签的物体(单个)
        GameObject playerGo = GameObject.FindWithTag("Player");
        Debug.Log("Player"+playerGo.name);

        //Object

        //根据类型查找对象
        Object.FindObjectOfType<MeshRenderer>();
        FindObjectsOfType<MeshRenderer>();

        //销毁对象
        //Object.Destroy

        //练习:查找血量最低的敌人
    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对象池是一种用于优化游戏性能的技术,其基本原理是在游戏启动时预先生成一定数量的对象,而不是在游戏运行时动态创建和销毁对象。这样可以减少内存分配和垃圾回收的开销,从而提高游戏的运行效率。 在Unity中,可以使用脚本来实现对象池。下面是一个简单的示例: ```csharp using System.Collections.Generic; using UnityEngine; public class ObjectPool : MonoBehaviour { public GameObject prefab; // 预制体 public int poolSize; // 对象池大小 private List<GameObject> pool; // 对象池 void Start() { pool = new List<GameObject>(); for (int i = 0; i < poolSize; i++) { GameObject obj = Instantiate(prefab); obj.SetActive(false); pool.Add(obj); } } public GameObject GetObject() { foreach (GameObject obj in pool) { if (!obj.activeInHierarchy) { obj.SetActive(true); return obj; } } GameObject newObj = Instantiate(prefab); pool.Add(newObj); return newObj; } public void ReturnObject(GameObject obj) { obj.SetActive(false); } } ``` 这个脚本包含了三个方法: - `Start()`:在游戏启动时预先生成一定数量的对象,并将它们添加到对象池中。 - `GetObject()`:从对象池中获取一个可用的对象。如果对象池中有可用对象,则直接返回;否则,创建一个新的对象并添加到对象池中。 - `ReturnObject()`:将一个对象返回到对象池中,以便下次使用。 使用对象池时,只需要调用 `GetObject()` 方法获取一个对象,并在使用完毕后调用 `ReturnObject()` 方法将其返回到对象池中即可。例如: ```csharp public class Example : MonoBehaviour { private ObjectPool objectPool; void Start() { objectPool = GetComponent<ObjectPool>(); } void Update() { if (Input.GetKeyDown(KeyCode.Space)) { GameObject obj = objectPool.GetObject(); obj.transform.position = Vector3.zero; obj.transform.rotation = Quaternion.identity; // 使用对象 } } } ``` 在这个示例中,当按下空格键时,从对象池中获取一个对象并将其置于原点,然后对其进行操作。在使用完毕后,将对象返回到对象池中。 需要注意的是,在使用对象池时,应该尽量避免频繁地获取和返回对象,以减少开销。另外,如果需要对对象进行初始化操作,应该在获取对象时进行,而不是在创建对象时进行。这样可以避免重复的初始化操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值