Scriptable Object仅打开资源后才可被检测的问题求助
问题解决:编辑器启动时无法检测到ScriptableObject实例
原因分析
Unity编辑器中,未被主动加载的ScriptableObject资源(既没被场景引用、也没通过代码加载)默认不会被实例化到内存中。只有当你在Inspector中打开这类资源时,Unity才会临时加载它们到内存,此时Resources.FindObjectsOfTypeAll才能检测到。
解决方案
方法1:使用Resources.LoadAll主动加载
将所有skinsbgcreator类型的ScriptableObject放在Resources文件夹下,然后用以下代码主动加载:
// 加载Resources根目录下所有skinsbgcreator类型资源,子文件夹可指定路径如"skins" doges = Resources.LoadAll<skinsbgcreator>("");
这种方法兼容编辑器和打包后的运行时,不需要额外的编辑器代码。
方法2:编辑器模式下用AssetDatabase查找(无需Resources文件夹)
如果不想依赖Resources文件夹,可在编辑器模式下通过AssetDatabase遍历项目中所有该类型资源:
#if UNITY_EDITOR using UnityEditor; // 查找所有skinsbgcreator类型资源的GUID string[] guids = AssetDatabase.FindAssets("t:skinsbgcreator"); doges = new skinsbgcreator[guids.Length]; for (int i = 0; i < guids.Length; i++) { // 通过GUID获取资源路径并加载 string assetPath = AssetDatabase.GUIDToAssetPath(guids[i]); doges[i] = AssetDatabase.LoadAssetAtPath<skinsbgcreator>(assetPath); } #endif
注意:AssetDatabase仅在编辑器环境可用,打包发布游戏时需要替换为Addressables、AssetBundles等运行时资源加载方案。
补充说明
Resources.FindObjectsOfTypeAll的作用是查找内存中已存在的对象实例,而非项目中所有资源文件。所以必须确保资源被加载到内存后,该方法才能返回结果。
内容的提问来源于stack exchange,提问作者Ilyass Frach
相关产品推荐
相关产品推荐

