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(); foreach (var ren in renderers) { Mesh sourceMesh = (ren is MeshRenderer mr) ? ren.GetComponent()?.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().sharedMesh = newMesh; else if (ren is SkinnedMeshRenderer s) s.sharedMesh = newMesh; } } } }