- Home /
Question by
utyasheva.irina · Nov 09, 2015 at 02:39 PM ·
unity5assetbundleasset
How to save assets fast (AssetDatabase.CreateAsset)
I have generated about 70 000 gameobjects with meshes and materials in a scene. I need to save these meshes and materials in assets. I save assets with AssetDatabase.CreateAsset, but its takes a lot of time (Save 10k meshes takes about 3.5 hours). I save meshes and materials in order to make bundles.
My code generate meshes and materials:
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();
}
Comment