建议阅读缩放比例:150%
本文技术推荐与对象池一起使用 优化—— 关于对象池

为什么需要统一资源管理

在之前的对象池中,我们经常需要做大量重复的动态获取,每次生成都要去 Resources.Load

这显然是很浪费性能的一件事,想象一下,如果你去图书馆取书,每一次都要按照位置信息,去一列一列的书架找,但这时如果有一个贴心的图书管理员小姐姐,已经提前把你可能需要用到的书准备好了,你只要和她说要什么书,她立刻就能给你想要的书籍,哇哦!这太棒了!

所以,在我们的游戏中,也可以设计一个这样管理机制,让我们省去重复查找的性能消耗。

如何设计统一资源管理器

既然需要一对一的指定获取,那就选择 Dictionary 容器,根据键值对(key-value)的特性,我们只需要告诉资源管理器物体的名称,他就能返回唯一的一个对象,记物体名称太麻烦,可以设置枚举类型来使用,在查找时转化为字符串类型即可,需要注意的是,枚举类型的名称要与查找的物体保持一致,不然就找不到了

代码部分

需要注意,统一资源管理器不需要挂载,不参与 Untiy 的生命周期,所以无需继承 MonoBehavior

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

public class ResourcesManager {
public static ResourcesManager instance = new ResourcesManager();
Dictionary<ResourcesEnum, GameObject> resourcesPoll = new Dictionary<ResourcesEnum, GameObject>();

public GameObject GetPrefab(ResourcesEnum prefabName) {
    if(resourcesPoll.ContainsKey(prefabName)) {
        return resourcesPoll[prefabName];
    } else {
        resourcesPoll.Add(prefabName, Resources.Load("Prefabs/" + prefabName.ToString()) as GameObject);
        return resourcesPoll[prefabName];
    }
}
}

public enum ResourcesEnum {
Bullet,
Crater
}

扩展

如果需要管理很多不同类型的资源,那么多做几个枚举类型,重载获取方法即可(记得更改前置的路径信息)