using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class HolebusterProcessor : MonoBehaviour
{
private static string _progressTitle = "Extracting Meshes";
private static string _sourceExtension = ".prefab";
private static string _targetExtension = ".asset";
private static Dictionary<string, Mesh> _uniqueMeshes = new Dictionary<string, Mesh>();
[MenuItem("GameObject/Process level", false, 0)]
public static void CreateTextArea(MenuCommand menuCommand)
{
var rootObject = (GameObject)menuCommand.context;
List<GameObject> childrenObjects = rootObject.GetChildren();
string selectedPath = EditorUtility.OpenFolderPanel("Folder to export", "Assets", "");
if (selectedPath.IndexOf(Application.dataPath) != 0)
{
EditorUtility.DisplayDialog("Error", "Please select a folder inside project", "OK");
return;
}
var path = selectedPath.Replace(Application.dataPath, "Assets");
if (AssetDatabase.IsValidFolder(path + @"/Prefabs") == false)
{
AssetDatabase.CreateFolder(path, "Prefabs");
}
_uniqueMeshes.Clear();
foreach (GameObject child in childrenObjects)
{
Clone(child, path + @"/Prefabs");
}
}
private static void Clone(GameObject go, string folder)
{
var transform = go.transform;
var papa = new GameObject();
papa.transform.SetParent(transform.parent);
papa.name = go.name.Replace(" ", "");
papa.transform.localScale = transform.localScale;
papa.transform.position = go.transform.position;
var clone = Instantiate(go, papa.transform);
clone.transform.localScale = Vector3.one;
clone.transform.localPosition = Vector3.zero;
PrefabUtility.SaveAsPrefabAssetAndConnect(papa, folder + @"/" + papa.name + ".prefab", InteractionMode.UserAction);
ExtractMeshes(clone, folder);
DestroyImmediate(go);
}
private static void ExtractMeshes(GameObject selectedObject, string folder)
{
MeshFilter viewedModelFilter = (MeshFilter)selectedObject.GetComponent("MeshFilter");
Renderer modelRenderer = selectedObject.GetComponent<Renderer>();
//Mesh mesh = viewedModelFilter.mesh;
Mesh mesh;// = Instantiate(viewedModelFilter.sharedMesh) as Mesh;
//Material material = selectedObject.GetComponent<Renderer>().material;
Material material = Instantiate(selectedObject.GetComponent<Renderer>().sharedMaterial) as Material;
string _meshID = GetMeshUniqueId(viewedModelFilter.sharedMesh);
if (_uniqueMeshes.ContainsKey(_meshID))
{
Debug.Log("Такой меш уже есть в словаре: <" + _meshID + ">. Пропускаем!");
_uniqueMeshes.TryGetValue(_meshID, out mesh);
}
else
{
mesh = Instantiate(viewedModelFilter.sharedMesh) as Mesh;
_uniqueMeshes.Add(_meshID, mesh);
Debug.Log(" Нужно добавить новый префаб меша: " + _meshID);
//Create Folder Hierarchy
string selectedObjectPath = AssetDatabase.GetAssetPath(selectedObject);
//string parentfolderPath = selectedObjectPath.Substring(0, selectedObjectPath.Length - (selectedObject.name.Length + 5));
string objectFolderName = selectedObject.name;
string objectFolderPath = folder + "/" + objectFolderName;
string meshFolderName = "Meshes";
string meshFolderPath = objectFolderPath + "/" + meshFolderName;
string materialFolderName = "Material";
string materialFolderPath = objectFolderPath + "/" + materialFolderName;
if (!AssetDatabase.IsValidFolder(objectFolderPath))
{
AssetDatabase.CreateFolder(folder, objectFolderName);
if (!AssetDatabase.IsValidFolder(meshFolderPath))
{
AssetDatabase.CreateFolder(objectFolderPath, meshFolderName);
}
if (!AssetDatabase.IsValidFolder(materialFolderPath))
{
AssetDatabase.CreateFolder(objectFolderPath, materialFolderName);
}
}
AssetDatabase.CreateAsset(mesh, meshFolderPath + "/" + selectedObject.name.Trim() + _targetExtension);
AssetDatabase.CreateAsset(material, materialFolderPath + "/" + selectedObject.name.Trim() + _targetExtension);
//Cleanup
AssetDatabase.MoveAsset(selectedObjectPath, objectFolderPath + "/" + selectedObject.name + _sourceExtension);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
viewedModelFilter.mesh = mesh;
selectedObject.GetComponent<Renderer>().material = material;
}
private static string GetMeshUniqueId(Mesh mesh)
{
var verticeFirst = mesh.vertices[0];
var verticeLast = mesh.vertices[mesh.vertices.Length - 1];
var res = mesh.vertexCount
+ "_" + mesh.triangles.Length
+ "_" + verticeFirst.x + "_" + verticeFirst.y + "_" + verticeFirst.z
+ "_" + verticeLast.x + "_" + verticeLast.y + "_" + verticeLast.z;
return res;
}
private static string GetMaterialUniqueID(Material mat)
{
var res = "";
return res;
}
}