Skip to content

Commit 2fecc35

Browse files
committed
fix: Material Utils Undo
1 parent 285df53 commit 2fecc35

File tree

1 file changed

+41
-19
lines changed

1 file changed

+41
-19
lines changed

Editor/Scripts/MaterialUtils.cs

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class MaterialUtils : EditorWindow
1414
private Material _material;
1515

1616

17-
[MenuItem("Open Commissioning/Material Utils")]
17+
[MenuItem("Open Commissioning/Tools/Material Utils")]
1818
public static void ShowMaterialManager()
1919
{
2020
var window = GetWindow<MaterialUtils>();
@@ -38,17 +38,17 @@ private void CreateGUI()
3838
rootVisualElement.Add(_objectField);
3939
rootVisualElement.Add(_materialField);
4040

41-
rootVisualElement.Add(new Button(ApplyMaterial)
41+
rootVisualElement.Add(new Button(OnButtonClick)
4242
{
4343
text = "Set for all"
4444
});
4545

46-
_objectField.RegisterCallback<ChangeEvent<Object>>((evt) =>
46+
_objectField.RegisterCallback<ChangeEvent<Object>>(evt =>
4747
{
4848
_target = (GameObject)evt.newValue;
4949
});
5050

51-
_materialField.RegisterCallback<ChangeEvent<Object>>((evt) =>
51+
_materialField.RegisterCallback<ChangeEvent<Object>>(evt =>
5252
{
5353
_material = (Material)evt.newValue;
5454
});
@@ -65,31 +65,53 @@ private void OnSelectionChange()
6565
}
6666
}
6767

68-
private void ApplyMaterial()
68+
private void OnButtonClick() => ApplyMaterial(_target, _material);
69+
70+
private void ApplyMaterial(GameObject root, Material material)
6971
{
70-
if (_target == null) return;
71-
if (_material == null) return;
72+
if (root == null) return;
73+
if (material == null) return;
7274
var counter = 0;
75+
76+
Undo.SetCurrentGroupName("Assign Material To Children");
77+
var group = Undo.GetCurrentGroup();
78+
Undo.RegisterFullObjectHierarchyUndo(root, "Assign Material To Children");
7379

74-
var renderes = _target.GetComponentsInChildren<Renderer>();
75-
foreach (var renderer in renderes)
80+
var renderers = _target.GetComponentsInChildren<Renderer>(includeInactive: false);
81+
foreach (var renderer in renderers)
7682
{
77-
Material[] materials = new Material[renderer.materials.Length];
78-
if (renderer.materials.Length > 1)
83+
if (renderer == null) continue;
84+
85+
Undo.RecordObject(renderer, "Assign Material To Children");
86+
87+
var sharedMaterials = new Material[renderer.sharedMaterials.Length];
88+
89+
switch (sharedMaterials.Length)
7990
{
80-
for (var i = 0; i < materials.Length; i++)
91+
case 0:
92+
continue;
93+
case 1:
94+
renderer.sharedMaterial = _material;
95+
UnityEditor.EditorUtility.SetDirty(renderer);
96+
counter++;
97+
break;
98+
case > 1:
8199
{
82-
materials[i] = _material;
83-
}
100+
for (var i = 0; i < sharedMaterials.Length; i++)
101+
{
102+
sharedMaterials[i] = _material;
103+
}
84104

85-
renderer.materials = materials;
86-
counter++;
105+
renderer.sharedMaterials = sharedMaterials;
106+
UnityEditor.EditorUtility.SetDirty(renderer);
107+
counter++;
108+
break;
109+
}
87110
}
88-
89-
renderer.material = _material;
90111
}
91112

92-
Debug.Log($"Materials Utils: {counter} materials are changed");
113+
Undo.CollapseUndoOperations(group);
114+
Debug.Log($"Material Utils: {counter} materials are changed");
93115
}
94116
}
95117
}

0 commit comments

Comments
 (0)