我在一个场景中生成了大约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();
}
}
答案 0 :(得分:1)
我找到了解决方案
我要保存+3000个对象,并且我意识到'AssetDatabase.CreateAsset'非常慢,所以我做到了。
AssetDatabase.StartAssetEditing();
foreach(.....)
AssetDatabase.CreateAsset(....)
AssetDatabase.StopAssetEditing();
那实际上救了我!