Spaces:
Sleeping
Sleeping
| using UnityEngine; | |
| using UnityEditor; | |
| using System; | |
| using System.IO; | |
| using System.Linq; | |
| using UnityMeshSimplifier; | |
| public class TestBuilder | |
| { | |
| public static void SimplifyOnly() | |
| { | |
| try | |
| { | |
| Debug.Log("๐ ๏ธ [UNITY] Memulai Proses Pengecilan & Embedding Mesh..."); | |
| string[] prefabPaths = Directory.GetFiles("Assets/InputRaw", "*.prefab", SearchOption.AllDirectories); | |
| foreach (string path in prefabPaths) | |
| { | |
| // 1. Load isi prefab | |
| GameObject go = PrefabUtility.LoadPrefabContents(path); | |
| if (go != null) | |
| { | |
| // 2. Jalankan simplifikasi dan tanam mesh ke dalam file prefab | |
| ProcessAndEmbed(go, path); | |
| // 3. Simpan perubahan ke asset fisik | |
| PrefabUtility.SaveAsPrefabAsset(go, path); | |
| // 4. Bersihkan memori | |
| PrefabUtility.UnloadPrefabContents(go); | |
| Debug.Log($"โ [EMBED] Mesh berhasil ditanam di: {Path.GetFileName(path)}"); | |
| } | |
| } | |
| // PENTING: Paksa database aset untuk menyimpan semua perubahan ke disk | |
| AssetDatabase.SaveAssets(); | |
| AssetDatabase.Refresh(); | |
| Debug.Log("โ [UNITY] Semua mesh telah diperkecil dan tertanam permanen."); | |
| EditorApplication.Exit(0); | |
| } | |
| catch (Exception e) | |
| { | |
| Debug.LogError($"๐ [FATAL] Gagal saat embedding: {e.Message}"); | |
| EditorApplication.Exit(1); | |
| } | |
| } | |
| static void ProcessAndEmbed(GameObject go, string assetPath) | |
| { | |
| var renderers = go.GetComponentsInChildren<Renderer>(); | |
| foreach (var ren in renderers) | |
| { | |
| Mesh sourceMesh = (ren is MeshRenderer mr) ? ren.GetComponent<MeshFilter>()?.sharedMesh : | |
| (ren is SkinnedMeshRenderer smr) ? smr.sharedMesh : null; | |
| if (sourceMesh != null) | |
| { | |
| var simplifier = new MeshSimplifier(); | |
| simplifier.Initialize(sourceMesh); | |
| simplifier.SimplifyMesh(0.05f); // 5% dari poligon asli | |
| Mesh newMesh = simplifier.ToMesh(); | |
| newMesh.name = sourceMesh.name + "_Simplified"; | |
| // --- BAGIAN KRUSIAL --- | |
| // Ini yang membuat mesh baru jadi "bagian" dari file .prefab tersebut | |
| // Jika baris ini hilang, mesh akan jadi 'None' saat di-build | |
| AssetDatabase.AddObjectToAsset(newMesh, assetPath); | |
| // ---------------------- | |
| if (ren is MeshRenderer) ren.GetComponent<MeshFilter>().sharedMesh = newMesh; | |
| else if (ren is SkinnedMeshRenderer s) s.sharedMesh = newMesh; | |
| } | |
| } | |
| } | |
| } |