Project_WL/Assets/ThirdParty/Mesh Optimizer/Scripts/OptimizeMesh.cs

132 lines
3.4 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
#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();
}
}
}
#endif
[ExecuteInEditMode]
public class OptimizeMesh : MonoBehaviour
{
[Range(0.0f, 1.0f)]
[SerializeField] float _quality = 0.5f;
MeshFilter _renderer;
Mesh _mesh;
bool existMesh;
string meshName;
public void Start()
{
_renderer = GetComponent<MeshFilter>();
_mesh = _renderer.sharedMesh;
int index = _mesh.name.IndexOf(" (", System.StringComparison.OrdinalIgnoreCase);
if (index > 0)
meshName = _mesh.name.Substring(0, index);
else
meshName = _mesh.name;
}
public void Set_Quality(float _q) { _quality = _q; }
#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;
var meshcollider = GetComponent<MeshCollider>();
if (meshcollider)
{
meshcollider.sharedMesh = destMesh;
meshcollider.convex = true;
}
}
}
public void DecimateMesh_byPath()
{
if (!EditorApplication.isPlaying)
{
var destMesh = AssetDatabase.LoadAssetAtPath<Mesh>("Assets/ResWork/Optimized/Optimized__" + meshName + ".asset");
if (destMesh != null)
{
existMesh = true;
_renderer.sharedMesh = destMesh;
}
else
{
var meshSimplifier = new UnityMeshSimplifier.MeshSimplifier();
meshSimplifier.Initialize(_mesh);
meshSimplifier.SimplifyMesh(_quality);
destMesh = meshSimplifier.ToMesh();
_renderer.sharedMesh = destMesh;
}
var meshcollider = GetComponent<MeshCollider>();
if (meshcollider)
{
meshcollider.sharedMesh = destMesh;
meshcollider.convex = true;
}
}
}
public void SaveMesh()
{
if (!EditorApplication.isPlaying)
{
MeshSaverEditor.SaveMesh(_renderer.sharedMesh, "Optimized__" + meshName, false, true);
}
}
public void SaveMesh(string path)
{
if (!EditorApplication.isPlaying)
{
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
if (!existMesh)
MeshSaverEditor.SaveMesh_WithPath(_renderer.sharedMesh, path + "Optimized__" + meshName + ".asset", false, true);
}
}
#endif
}