testing / UnityProject /Assets /Editor /TestBuilder.cs
webzepetoku's picture
Update UnityProject/Assets/Editor/TestBuilder.cs
18e797a verified
Raw
History Blame Contribute Delete
2.95 kB
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;
}
}
}
}