如何快速保存资产(AssetDatabase.CreateAsset)



我已经在一个场景中生成了大约70000个带有网格和材质的游戏对象。我需要将这些网格和材质保存在资源中。我用AssetDatabase.CreateAsset保存资产,但它需要很多时间(大约24小时)。我保存网格和材质以便制作束。

我的代码生成网格和材质:

public class SaveAssetsUtils
{
static public void Save(string path, GameObject target)
{
    if (!Directory.Exists(path))
        Directory.CreateDirectory(path);
    string materialsPathBase = path + "Materials/";
    string meshesPathBase = path + "Meshes/";
    if (!Directory.Exists(materialsPathBase))
        Directory.CreateDirectory(materialsPathBase);
    else
        FilesUtils.ClearFolder(materialsPathBase);
    int folderIndex = 0;
    string meshesDir = "dir" + folderIndex + "/";
    if (!Directory.Exists(meshesPathBase))
        Directory.CreateDirectory(meshesPathBase);
    else
        FilesUtils.ClearFolder(meshesPathBase);
    if (!Directory.Exists(meshesPathBase + meshesDir))
        Directory.CreateDirectory(meshesPathBase + meshesDir);
    MeshFilter[] meshFilters = target.GetComponentsInChildren<MeshFilter>(true);
    ProgressUtil.Progress("Starting save assets", "starting save assets " + meshFilters.Length, 0.323f);
    int indexMesh = 0;
    int indexMaterial = 0;
    int countMeshes = 0;
    int count = meshFilters.Length;
    for (int i = 0; i < meshFilters.Length; i++)
    {
        var meshFilter = meshFilters[i];
        var meshRenderer = meshFilter.gameObject.GetComponent<MeshRenderer>();
        var materialName = meshRenderer.sharedMaterial.name;
        if (materialName.IndexOf("exists") == -1)
        {
            var pathMaterial = materialsPathBase + "_exists_" + indexMaterial + ".mat";
            meshRenderer.sharedMaterial.name = "_exists_" + indexMaterial;
            UnityEditor.AssetDatabase.CreateAsset(meshRenderer.sharedMaterial, pathMaterial);
            indexMaterial++;
        }
        var meshName = meshFilter.sharedMesh.name;
        if (meshName.IndexOf("exists") == -1)
        {
            ProgressUtil.Progress("Save mesh", "save mesh " + indexMesh + " from " + meshFilters.Length, 0.323f + (0.68f / count) * indexMesh );
            var pathMesh = meshesPathBase + meshesDir + "_exists_" + i + ".asset";
            meshFilter.sharedMesh.name = "_exists_" + indexMesh;
            UnityEditor.AssetDatabase.CreateAsset(meshFilter.sharedMesh, pathMesh);
            indexMesh++;
            countMeshes++;
        }
        if (countMeshes > 100)
        {
            folderIndex++;
            countMeshes = 0;
            meshesDir = "dir" + folderIndex + "/";
            if (!Directory.Exists(meshesPathBase + meshesDir))
                Directory.CreateDirectory(meshesPathBase + meshesDir);
        }
    }
    UnityEditor.AssetDatabase.SaveAssets();
}

}

我找到了这个的解决方案

我有+3000个对象要保存,我意识到"AssetDatabase.CreateAsset"相当慢,所以我喜欢这样做。

AssetDatabase.StartAssetEditing();
foreach(.....)
     AssetDatabase.CreateAsset(....)
AssetDatabase.StopAssetEditing();

那真的救了我!

最新更新