如何查找某个类型的所有资产?

问题描述 投票:0回答:2

在我的 Unity 项目中,有几个 ArmourType 类的实例(这些是资产、可编写脚本的对象)。我试图在检查器的下拉列表中显示这些,这很有效。不过,我用

List<ArmourType> armourTypes = Resources.FindObjectsOfTypeAll<ArmourType>();

找到所有这些实例。这只会找到加载到内存中的对象,因此有时它只会找到一些所需的资源。这是有记录的,所以不是一个错误,但有时很烦人。

所以我的问题是,是否有一种不同的方法来获取所有这些资产并返回那些未加载到内存中的资产?或者也许有一种方法可以让 Unity 在查找资源时加载它们?

注意:我使用的是Unity5和c#。

c# unity-game-engine
2个回答
15
投票

这是您要找的吗?

string[] guids = AssetDatabase.FindAssets ("t:ArmourType", null);
foreach (string guid in guids) {
    Debug.Log (AssetDatabase.GUIDToAssetPath(guid));
}

http://docs.unity3d.com/ScriptReference/AssetDatabase.FindAssets.html

AssetDatabase 是一个编辑器脚本。如果您想在游戏中执行类似的操作,请将相关脚本放入资源文件夹中(这确保它们将包含在构建中,即使未链接到场景中)并使用:

Resources.LoadAll<ArmourType>("");

0
投票

这是先前答案的更深入书面版本的另一个示例。这个比较符合原语,所以分享给大家

#if UNITY_EDITOR
    public void OnEnable()
    {
        _levels = LoadAssetsOfType<LevelData>();
        _items = LoadAssetsOfType<ItemData>();
        _recipes = LoadAssetsOfType<RecipeData>();
        _species = LoadAssetsOfType<SpeciesData>();
    }

    public static T[] LoadAssetsOfType<T>() where T : UnityEngine.Object
    {
        return AssetDatabase
            .FindAssets($"t:{typeof(T).Name}")
            .Select(AssetDatabase.GUIDToAssetPath)
            .Select(AssetDatabase.LoadAssetAtPath<T>)
            .ToArray();
    }
#endif
  • 请记住,构建项目时资产数据库不存在,因此请使用预处理器
    #if UNITY_EDITOR
    以避免出现问题。
  • OnEnable
    仅在您启动播放模式时触发。这是第一个运行的钩子,所以不用担心依赖项的时间。
  • 您需要为此导入
    System.Linq
© www.soinside.com 2019 - 2024. All rights reserved.