UPF/Assets/Mesh Optimizer/Scripts/OptimizeMesh.cs
2022-05-13 19:27:20 +05:30

90 lines
2.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
[CustomEditor(typeof(OptimizeMesh))]
public class LevelScriptEditor : Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
OptimizeMesh myTarget = (OptimizeMesh)target;
if (GUILayout.Button("Optimize Mesh!"))
{
myTarget.DecimateMesh();
}
if (GUILayout.Button("Save Mesh!"))
{
myTarget.SaveMesh();
}
if(GUILayout.Button("! Optimize All !")){
OptimizeMesh[] targets = FindObjectsOfType<OptimizeMesh>();
int passed = 0;
foreach(OptimizeMesh target in targets){
target.DecimateMesh();
passed++;
}
Debug.Log("Optimized " + passed + " meshes");
}
if(GUILayout.Button("! RESET ALL !")){
OptimizeMesh[] targets = FindObjectsOfType<OptimizeMesh>();
foreach(OptimizeMesh target in targets){
target._quality = 1;
target.DecimateMesh();
}
}
}
}
#endif
[ExecuteInEditMode]
public class OptimizeMesh : MonoBehaviour
{
[Range(0.0f, 1.0f)]
[SerializeField]public float _quality = 0.5f;
MeshFilter _renderer;
Mesh _mesh;
void Start()
{
_renderer = GetComponent<MeshFilter>();
_mesh = _renderer.sharedMesh;
}
#if UNITY_EDITOR
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.O))
{
DecimateMesh();
}
}
public void DecimateMesh()
{
if (!EditorApplication.isPlaying)
{
var meshSimplifier = new UnityMeshSimplifier.MeshSimplifier();
meshSimplifier.Initialize(_mesh);
meshSimplifier.SimplifyMesh(_quality);
var destMesh = meshSimplifier.ToMesh();
_renderer.sharedMesh = destMesh;
}
}
public void SaveMesh()
{
if (!EditorApplication.isPlaying)
{
MeshSaverEditor.SaveMesh(_renderer.sharedMesh, "Optimized__" + gameObject.name, false, true);
}
}
#endif
}