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;
            }
        }
    }
}