Spaces:
Sleeping
Sleeping
File size: 2,950 Bytes
396e9bd 8054c2a 396e9bd 37fe00a 8fffbf7 396e9bd 121028e 18e797a 121028e 18e797a 959ab53 ab374f8 eda3d3a aba2c22 724695e 18e797a aba2c22 724695e 18e797a aba2c22 18e797a 724695e 18e797a 8f3ee6b aba2c22 18e797a 121028e 8fffbf7 aba2c22 18e797a 121028e 18e797a 121028e e50a4c1 8f3ee6b 18e797a e50a4c1 18e797a 7db760f 18e797a 7db760f 121028e 8fffbf7 61cfa5d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | 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;
}
}
}
} |