我已经在一个场景中生成了大约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();
那真的救了我!