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(); _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(); if (meshcollider) { meshcollider.sharedMesh = destMesh; meshcollider.convex = true; } } } public void DecimateMesh_byPath() { if (!EditorApplication.isPlaying) { var destMesh = AssetDatabase.LoadAssetAtPath("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(); 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 }