@@ -8,13 +8,14 @@ namespace OC.Editor
88{
99 public class MaterialUtils : EditorWindow
1010 {
11+ private const string PREFS_MATERIAL_LAST = "PREFS_MaterialUtils_MATERIAL_LAST" ;
12+
1113 private ObjectField _objectField ;
1214 private ObjectField _materialField ;
1315 private GameObject _target ;
1416 private Material _material ;
1517
16-
17- [ MenuItem ( "Open Commissioning/Material Utils" ) ]
18+ [ MenuItem ( "Open Commissioning/Tools/Material Utils" ) ]
1819 public static void ShowMaterialManager ( )
1920 {
2021 var window = GetWindow < MaterialUtils > ( ) ;
@@ -38,22 +39,45 @@ private void CreateGUI()
3839 rootVisualElement . Add ( _objectField ) ;
3940 rootVisualElement . Add ( _materialField ) ;
4041
41- rootVisualElement . Add ( new Button ( ApplyMaterial )
42+ rootVisualElement . Add ( new Button ( OnButtonClick )
4243 {
4344 text = "Set for all"
4445 } ) ;
4546
46- _objectField . RegisterCallback < ChangeEvent < Object > > ( ( evt ) =>
47+ _objectField . RegisterCallback < ChangeEvent < Object > > ( evt =>
4748 {
4849 _target = ( GameObject ) evt . newValue ;
4950 } ) ;
5051
51- _materialField . RegisterCallback < ChangeEvent < Object > > ( ( evt ) =>
52+ _materialField . RegisterCallback < ChangeEvent < Object > > ( evt =>
5253 {
5354 _material = ( Material ) evt . newValue ;
5455 } ) ;
5556
5657 OnSelectionChange ( ) ;
58+
59+ _materialField . SetValueWithoutNotify ( LoadMaterialFromPrefs ( ) ) ;
60+ }
61+
62+ private void OnDisable ( )
63+ {
64+ SafeMaterialPrefs ( _material ) ;
65+ }
66+
67+ private Material LoadMaterialFromPrefs ( )
68+ {
69+ var id = PlayerPrefs . GetString ( PREFS_MATERIAL_LAST ) ;
70+ return string . IsNullOrEmpty ( id ) ? null : AssetDatabase . LoadAssetAtPath < Material > ( id ) ;
71+ }
72+
73+ private void SafeMaterialPrefs ( Material material )
74+ {
75+ if ( material == null ) return ;
76+ var path = AssetDatabase . GetAssetPath ( material ) ;
77+ if ( string . IsNullOrEmpty ( path ) ) return ;
78+
79+ PlayerPrefs . SetString ( PREFS_MATERIAL_LAST , path ) ;
80+ PlayerPrefs . Save ( ) ;
5781 }
5882
5983 private void OnSelectionChange ( )
@@ -65,31 +89,51 @@ private void OnSelectionChange()
6589 }
6690 }
6791
68- private void ApplyMaterial ( )
92+ private void OnButtonClick ( ) => ApplyMaterial ( _target , _material ) ;
93+
94+ private void ApplyMaterial ( GameObject root , Material material )
6995 {
70- if ( _target == null ) return ;
71- if ( _material == null ) return ;
96+ if ( root == null ) return ;
97+ if ( material == null ) return ;
7298 var counter = 0 ;
7399
74- var renderes = _target . GetComponentsInChildren < Renderer > ( ) ;
75- foreach ( var renderer in renderes )
100+ var renderers = _target . GetComponentsInChildren < Renderer > ( includeInactive : false ) ;
101+ if ( renderers == null || renderers . Length == 0 ) return ;
102+
103+ Undo . SetCurrentGroupName ( "Assign Material To Children" ) ;
104+ var group = Undo . GetCurrentGroup ( ) ;
105+
106+ foreach ( var renderer in renderers )
76107 {
77- Material [ ] materials = new Material [ renderer . materials . Length ] ;
78- if ( renderer . materials . Length > 1 )
108+ if ( renderer == null ) continue ;
109+ Undo . RecordObject ( renderer , "Assign Material To Children" ) ;
110+
111+ var sharedMaterials = new Material [ renderer . sharedMaterials . Length ] ;
112+
113+ switch ( sharedMaterials . Length )
79114 {
80- for ( var i = 0 ; i < materials . Length ; i ++ )
115+ case 0 :
116+ continue ;
117+ case 1 :
118+ renderer . sharedMaterial = _material ;
119+ counter ++ ;
120+ break ;
121+ case > 1 :
81122 {
82- materials [ i ] = _material ;
83- }
123+ for ( var i = 0 ; i < sharedMaterials . Length ; i ++ )
124+ {
125+ sharedMaterials [ i ] = _material ;
126+ }
84127
85- renderer . materials = materials ;
86- counter ++ ;
128+ renderer . sharedMaterials = sharedMaterials ;
129+ counter ++ ;
130+ break ;
131+ }
87132 }
88-
89- renderer . material = _material ;
90133 }
91134
92- Debug . Log ( $ "Materials Utils: { counter } materials are changed") ;
135+ Undo . CollapseUndoOperations ( group ) ;
136+ Debug . Log ( $ "Material Utils: { counter } materials are changed") ;
93137 }
94138 }
95139}
0 commit comments