为什么在调用Resources.FindObjectsOfTypeAll()时未加载我的资源

时间:2019-02-02 21:18:49

标签: c# unity3d

我有一种方法在我的游戏,动态查找并实例预制件到我的场景这样

public void CreateAgent(string agentName)
{
   var prefabs = Resources.FindObjectsOfTypeAll<Agent>();
   var selectedPrefab = prefabs.Where(p => p.name == agentName).FirstOrDefault();
   Instantiate(selectedPrefab.gameObject);
}

这有时可行,但似乎有时预制件的资源尚未加载,因此Resources.FindObjectsOfTypeAll()不会返回我要加载的资源。我可以通过先致电Resources.LoadAll<Agent>("MyPrefabDirectory")来解决此问题,但不确定在游戏过程中这样做是否会引起问题或使游戏速度变慢。似乎Unity也正在卸载先前使用的资源,因为我可以将预制A加载到我的场景中,然后加载一个新场景,并且当我尝试在新场景中加载预制A时,导致{ {1}}

所以我的问题是

  1. 为什么我要叫Resources.FindObjectsOfTypeAll() {前{1}}会找到我的预制?
  2. 为什么我在更改场景时Unity会卸载以前加载的资源?
  3. 游戏玩法不好时打Resources.LoadAll()吗?

1 个答案:

答案 0 :(得分:1)

来自文档

Resources.FindObjectsOfType()

  

此函数可以返回已加载的任何类型的Unity对象。

为什么Unity会卸载以前加载的资源?节省内存。如果不使用它,它将收集垃圾。

考虑到您将只使用返回的对象之一,您可能应该重构为只对实际需要的单个对象调用Load