在我的 Unity 项目中,有几个 ArmourType 类的实例(这些是资产、可编写脚本的对象)。我试图在检查器的下拉列表中显示这些,这很有效。不过,我用
List<ArmourType> armourTypes = Resources.FindObjectsOfTypeAll<ArmourType>();
找到所有这些实例。这只会找到加载到内存中的对象,因此有时它只会找到一些所需的资源。这是有记录的,所以不是一个错误,但有时很烦人。
所以我的问题是,是否有一种不同的方法来获取所有这些资产并返回那些未加载到内存中的资产?或者也许有一种方法可以让 Unity 在查找资源时加载它们?
注意:我使用的是Unity5和c#。
这是您要找的吗?
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>("");
这是先前答案的更深入书面版本的另一个示例。这个比较符合原语,所以分享给大家
#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
。