132 lines
3.4 KiB
C#
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
|
|
} |