You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:44:50