@@ -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