如何在Incisor项目中遍历Assets文件夹内的资源?
如何在Incisor项目中遍历Assets文件夹内的资源?
嘿,完全没问题!在Incisor项目里实现Assets文件夹的资源遍历,还要支持运行时操作,其实有几种实用的方案,我结合实际开发经验给你拆解下:
一、编辑模式下遍历(适合开发阶段预处理)
这个方式只能在编辑器里用,适合批量修改资源、标记资源这类开发阶段的操作
Incisor的编辑器API提供了AssetDatabase类,能直接访问项目里的所有资源路径,很适合做遍历。这里给你一个简单的示例:
using Incisor.Editor; using UnityEngine; public class BatchAssetProcessor : EditorWindow { // 在编辑器菜单里加个入口,方便调用 [MenuItem("Tools/批量遍历Assets资源")] public static void StartAssetIteration() { // 获取项目中所有资源的路径 string[] allAssetPaths = AssetDatabase.GetAllAssetPaths(); foreach (string path in allAssetPaths) { // 只筛选Assets文件夹下的资源,排除系统路径 if (path.StartsWith("Assets/")) { Debug.Log("找到资源:" + path); // 加载对应的资源对象 Object targetAsset = AssetDatabase.LoadAssetAtPath<Object>(path); // 这里可以做编辑模式下的资源操作,比如修改资源属性 if (targetAsset is Material mat) { mat.color = Color.gray; // 记得标记资源为已修改,最后保存 EditorUtility.SetDirty(mat); } } } // 保存所有修改到磁盘 AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Debug.Log("资源遍历与操作完成!"); } }
二、运行时遍历(打包后也能正常工作)
运行时不能用编辑器API,所以得换用Runtime层面的资源加载方案,这里推荐两种常用的:
1. 基于Resources文件夹的简易遍历
如果你的资源都放在Assets/Resources目录下,可以用Resources.LoadAll()直接加载该文件夹下的所有资源,然后遍历:
using UnityEngine; public class RuntimeAssetIterator : MonoBehaviour { void Start() { // 加载Resources根目录下的所有资源(也可以指定子文件夹路径,比如"Textures") Object[] runtimeAssets = Resources.LoadAll(""); foreach (Object asset in runtimeAssets) { Debug.Log("运行时资源:" + asset.name); // 运行时操作资源,比如实例化预制体、修改纹理参数 if (asset is GameObject prefab) { Instantiate(prefab, transform.position, Quaternion.identity); } else if (asset is Texture2D texture) { texture.filterMode = FilterMode.Point; } } } }
注意:Resources文件夹的资源会被全部打包进安装包,不适合存放大量资源,否则会增大包体体积。
2. 基于AssetBundle的灵活遍历
如果资源量比较大,或者需要动态加载/卸载,推荐用AssetBundle:
- 第一步(编辑模式):把Assets文件夹下需要遍历的资源打包成AssetBundle,可以用编辑器脚本批量标记并打包;
- 第二步(运行时):加载AssetBundle,然后遍历其中的所有资源:
using UnityEngine; using System.Collections; public class AssetBundleIterator : MonoBehaviour { public string assetBundlePath = "Assets/AssetBundles/myassets.ab"; IEnumerator Start() { // 加载本地的AssetBundle using (var bundle = AssetBundle.LoadFromFile(assetBundlePath)) { if (bundle == null) { Debug.LogError("加载AssetBundle失败:" + assetBundlePath); yield break; } // 获取Bundle内的所有资源名称 string[] allAssetNames = bundle.GetAllAssetNames(); foreach (string assetName in allAssetNames) { Debug.Log("Bundle内的资源:" + assetName); // 加载对应的资源 Object asset = bundle.LoadAsset<Object>(assetName); // 运行时操作资源 if (asset is AudioClip clip) { AudioSource.PlayClipAtPoint(clip, transform.position); } } // 用完记得卸载Bundle(如果不需要保留资源的话) bundle.Unload(false); } } }
三、关键注意事项
- 运行时无法直接修改原始资源文件(打包后资源是只读的),如果要修改,必须先创建资源的内存副本,操作副本对象;
- 遍历资源时尽量过滤类型,比如只处理
Texture2D、GameObject等,避免加载不必要的资源,提升性能; - 用AssetBundle时,记得管理好资源的加载与卸载,避免内存泄漏。
备注:内容来源于stack exchange,提问作者Matt C
相关产品推荐
相关产品推荐

