Unity对象实例的执行顺序探究及一个对象关联多个脚本的

一,概述

    前面我们测试了,脚本在程序运行过程中,相关方法的执行流程. 今天我们测试一下在某个场景中,场景中的对象实例化执行的顺序,方便我们开发过程中,能够多方面考虑.

二,Unity对象实例的执行顺序

     1>测试

    如下图所示,新建一个工程,在Hierarchy视图中创建多个游戏对象及其子对象,在Project视图中,然后我们给每个对象创建一个脚本文件,按照顺序将脚本绑定在对应的游戏对象身上。如图

  
在每个脚本中Start函数中打印Debug相关对象名称. 播放游戏,看看他们的执行顺序,结果如下图
 

     2>结论

      从打印的结果中,我们猜测Unity先对灯光(Directional Light)进行对象实例化,然后是摄像机(MainCamera) , 之后从对象的树形目录的最底端的最深层开始实例化对象,然后逐个向上实例!

三,对象关联多个脚本的执行顺序

     1>测试

     如下图所示,新建一个工程,在Project视图中,然后我们给Main Camera, Directional Light对象分别创建三个脚本文件,按照顺序将脚本绑定在对应的游戏对象身上。如图
         
     创建相关工程和对应的脚本.

  
Directional Light 的inspector
  
Main Camera的inspector

  在每个脚本中Start函数中打印Debug相关对象名称. 播放游戏,看看他们的执行顺序,结果如下图

     

 2>结论

      从打印的结果中,我们猜测Unity从对象脚本的树形目录的最底端的最深层开始实例化对象,然后逐个向上实例!

下面是一个示例脚本,用于在Unity对象池中索引多个角色: ```csharp using UnityEngine; using System.Collections.Generic; public class ObjectPool : MonoBehaviour { [System.Serializable] public class Pool { public string tag; public GameObject prefab; public int size; } public List<Pool> pools; public Dictionary<string, Queue<GameObject>> poolDictionary; void Start() { poolDictionary = new Dictionary<string, Queue<GameObject>>(); foreach (Pool pool in pools) { Queue<GameObject> objectPool = new Queue<GameObject>(); for (int i = 0; i < pool.size; i++) { GameObject obj = Instantiate(pool.prefab); obj.SetActive(false); objectPool.Enqueue(obj); } poolDictionary.Add(pool.tag, objectPool); } } public GameObject SpawnFromPool(string tag, Vector3 position, Quaternion rotation) { if (!poolDictionary.ContainsKey(tag)) { Debug.LogWarning("Pool with tag " + tag + " doesn't exist."); return null; } GameObject objectToSpawn = poolDictionary[tag].Dequeue(); objectToSpawn.SetActive(true); objectToSpawn.transform.position = position; objectToSpawn.transform.rotation = rotation; poolDictionary[tag].Enqueue(objectToSpawn); return objectToSpawn; } } ``` 在这个示例脚本中,我们使用了一个List来存储所有的对象池,并使用一个Dictionary来存储每个对象池中的所有对象。在Start()函数中,我们遍历所有的对象池,创建一定数量的对象,并将它们添加到对象池中。在SpawnFromPool()函数中,我们使用传入的标签参数来获取对象池中的对象,并将其设置为激活状态,并设置其位置和旋转。注意,我们使用了一个Queue来实现对象池的FIFO(先进先出)逻辑。 您可以根据自己的需求修改和扩展这个示例脚本。例如,您可以添加一个索引标识符参数来标识不同的角色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值