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

时间:2015-11-06 05:10:42

标签: unity3d bundle assets

我在一个场景中生成了大约70,000个带有网格和材质的游戏对象。我需要在资产中保存这些网格和材质。我使用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();
}

}

1 个答案:

答案 0 :(得分:1)

我找到了解决方案

我要保存+3000个对象,并且我意识到'AssetDatabase.CreateAsset'非常慢,所以我做到了。

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

那实际上救了我!