using UnityEngine; using UnityEditor; public static class MeshBakerPurgeNullObjects { [MenuItem("Tools/Mesh Baker/Purge Null Objects From Selected Baker")] public static void PurgeNullObjectsFromSelectedBaker() { GameObject selected = Selection.activeGameObject; if (selected == null) { Debug.LogError("Aucun GameObject sélectionné."); return; } Component[] components = selected.GetComponents(); bool foundList = false; int totalRemoved = 0; foreach (Component component in components) { if (component == null) continue; SerializedObject so = new SerializedObject(component); // Nom utilisé par Mesh Baker pour la liste Objects To Be Combined SerializedProperty objectsList = so.FindProperty("objsToMesh"); if (objectsList == null || !objectsList.isArray) continue; foundList = true; int removed = 0; // Important : on parcourt à l'envers pour supprimer sans décaler les indices restants. for (int i = objectsList.arraySize - 1; i >= 0; i--) { SerializedProperty element = objectsList.GetArrayElementAtIndex(i); if (element.propertyType == SerializedPropertyType.ObjectReference && element.objectReferenceValue == null) { objectsList.DeleteArrayElementAtIndex(i); removed++; } } if (removed > 0) { so.ApplyModifiedProperties(); EditorUtility.SetDirty(component); totalRemoved += removed; Debug.Log($"Mesh Baker : {removed} entrée(s) null supprimée(s) dans {component.GetType().Name}."); } } if (!foundList) { Debug.LogError( "Aucune liste 'objsToMesh' trouvée sur l'objet sélectionné. " + "Sélectionne l'objet TextureBaker ou MeshBaker qui contient 'Objects To Be Combined'." ); return; } AssetDatabase.SaveAssets(); Debug.Log($"Purge terminée. Total supprimé : {totalRemoved} entrée(s) null."); } }