Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 109 additions & 0 deletions Editor/MeshSimpliferEditor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
using UnityEngine;
using UnityEditor;
using System.IO;

public class MeshSimplifierEditor : EditorWindow
{
private SkinnedMeshRenderer[] selectedMeshRenderers;
private float quality = 0.5f;

[MenuItem("SimplifyMesh Editor/Simplify Mesh")]
static void Init()
{
MeshSimplifierEditor window = (MeshSimplifierEditor)EditorWindow.GetWindow(typeof(MeshSimplifierEditor));
window.Show();
}

void OnGUI()
{
GUILayout.Label("Mesh Simplification", EditorStyles.boldLabel);

EditorGUILayout.Space();

EditorGUILayout.LabelField("Select Skinned Mesh Renderers:");

// If the array is null, initialize it
if (selectedMeshRenderers == null)
{
selectedMeshRenderers = new SkinnedMeshRenderer[0];
}

// Display the selection field for each element in the array
for (int i = 0; i < selectedMeshRenderers.Length; i++)
{
selectedMeshRenderers[i] = EditorGUILayout.ObjectField(
$"Element {i + 1}",
selectedMeshRenderers[i],
typeof(SkinnedMeshRenderer),
true
) as SkinnedMeshRenderer;
}

// Display an "Add" button to add more elements to the array
if (GUILayout.Button("Add Mesh Renderer"))
{
ArrayUtility.Add(ref selectedMeshRenderers, null);
}

EditorGUILayout.Space();
if (GUILayout.Button("Remove Mesh Renderer") && selectedMeshRenderers.Length > 0)
{
ArrayUtility.RemoveAt(ref selectedMeshRenderers, selectedMeshRenderers.Length - 1);
}


EditorGUILayout.Space();

quality = EditorGUILayout.Slider("Quality", quality, 0.01f, 1f);

if (GUILayout.Button("Begin Simplification"))
{
SimplifyMeshes();
}
}

void SimplifyMeshes()
{
if (selectedMeshRenderers == null || selectedMeshRenderers.Length == 0)
{
Debug.LogWarning("No Skinned Mesh Renderers selected.");
return;
}
else
{
foreach (var meshRenderer in selectedMeshRenderers)
{
if (meshRenderer == null)
{
Debug.LogWarning("One of the selected mesh renderers is null.");
continue;
}

// The rest of the code remains unchanged
var originalMesh = meshRenderer.sharedMesh;
var meshSimplifier = new UnityMeshSimplifier.MeshSimplifier();
meshSimplifier.Initialize(originalMesh);
meshSimplifier.SimplifyMesh(quality);
var destMesh = meshSimplifier.ToMesh();

string folderPath = "Assets/Simplified Meshes";
string meshName = meshRenderer.transform.name.Replace(":", "_");
string fileName = $"mesh_{meshName}_{meshRenderer.transform.GetSiblingIndex()}.asset";

string filePath = Path.Combine(folderPath, fileName);

if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}

AssetDatabase.CreateAsset(destMesh, filePath);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
meshRenderer.sharedMesh = destMesh;

Debug.Log($"Mesh simplified and saved at: {filePath}");
}
}
}
}