@@ -11,6 +11,8 @@ namespace Gilzoide.ConditionalObjects
11
11
{
12
12
public class EmbeddedPresetHolder : ScriptableObject
13
13
{
14
+ #region Instance
15
+
14
16
public static readonly string InstanceAssetPath = $ "Assets/ConditionalObjects/Editor/{ nameof ( EmbeddedPresetHolder ) } .asset";
15
17
16
18
public static EmbeddedPresetHolder Instance => _instance ? _instance : ( _instance = GetOrCreateInstance ( ) ) ;
@@ -33,69 +35,98 @@ static EmbeddedPresetHolder GetOrCreateInstance()
33
35
return instance ;
34
36
}
35
37
38
+ #endregion
39
+
36
40
[ Serializable ]
37
- public class EmbeddedPreset
41
+ internal class EmbeddedPresets : IComparable < EmbeddedPresets >
38
42
{
39
43
public GUID AssetGuid ;
40
- public Preset Preset ;
44
+ public List < Preset > PresetList ;
45
+
46
+ public int CompareTo ( EmbeddedPresets other )
47
+ {
48
+ return AssetGuid . CompareTo ( other . AssetGuid ) ;
49
+ }
41
50
}
42
51
43
- [ SerializeField ] private List < EmbeddedPreset > _embeddedPresets = new List < EmbeddedPreset > ( ) ;
52
+ [ SerializeField ] private List < EmbeddedPresets > _embeddedPresets = new List < EmbeddedPresets > ( ) ;
44
53
45
54
public Preset CreatePreset ( GameObject ownerObject , Object target )
46
55
{
47
56
string assetPath = ownerObject . GetAssetPath ( ) ;
48
- return CreatePreset ( AssetDatabase . AssetPathToGUID ( assetPath ) , target ) ;
57
+ return CreatePreset ( assetPath , target ) ;
58
+ }
59
+
60
+ public void HandleAssetDelete ( string assetPath )
61
+ {
62
+ RemoveEmbeddedPresets ( assetPath ) ;
49
63
}
50
64
51
- public Preset CreatePreset ( string assetGuid , Object target )
65
+ public void DeleteOrphanPresets ( string assetPath , HashSet < Preset > referencedPresets )
52
66
{
53
- if ( string . IsNullOrEmpty ( AssetDatabase . GUIDToAssetPath ( assetGuid ) ) )
67
+ GetEmbeddedPresets ( assetPath ) ? . PresetList . RemoveAll ( p =>
54
68
{
55
- throw new ArgumentOutOfRangeException ( nameof ( assetGuid ) , "GUID is not know in AssetDatabase" ) ;
56
- }
69
+ bool shouldRemove = ! referencedPresets . Contains ( p ) ;
70
+ if ( shouldRemove )
71
+ {
72
+ DestroyImmediate ( p , true ) ;
73
+ }
74
+ return shouldRemove ;
75
+ } ) ;
76
+ }
57
77
78
+ private Preset CreatePreset ( string assetPath , Object target )
79
+ {
80
+ var guid = new GUID ( AssetDatabase . AssetPathToGUID ( assetPath ) ) ;
58
81
var preset = new Preset ( target )
59
82
{
60
- name = $ "{ assetGuid } -{ GlobalObjectId . GetGlobalObjectIdSlow ( target ) . targetObjectId } ",
83
+ name = $ "{ guid } -{ GlobalObjectId . GetGlobalObjectIdSlow ( target ) . targetObjectId } ",
84
+ hideFlags = HideFlags . HideInHierarchy ,
61
85
} ;
62
86
preset . ExcludeAllProperties ( ) ;
63
- _embeddedPresets . Add ( new EmbeddedPreset
64
- {
65
- AssetGuid = new GUID ( assetGuid ) ,
66
- Preset = preset ,
67
- } ) ;
68
87
AssetDatabase . AddObjectToAsset ( preset , this ) ;
69
- AssetDatabase . SaveAssetIfDirty ( this ) ;
88
+ GetOrCreateEmbeddedPresets ( assetPath ) . PresetList . Add ( preset ) ;
70
89
return preset ;
71
90
}
72
91
73
- public void HandleAssetDelete ( string assetPath )
92
+ private EmbeddedPresets GetEmbeddedPresets ( string assetPath )
74
93
{
75
94
var guid = new GUID ( AssetDatabase . AssetPathToGUID ( assetPath ) ) ;
76
- _embeddedPresets . RemoveAll ( p =>
95
+ int index = _embeddedPresets . BinarySearch ( new EmbeddedPresets { AssetGuid = guid } ) ;
96
+ if ( index >= 0 )
77
97
{
78
- bool shouldRemove = p . AssetGuid == guid ;
79
- if ( shouldRemove )
80
- {
81
- DestroyImmediate ( p . Preset , true ) ;
82
- }
83
- return shouldRemove ;
84
- } ) ;
98
+ return _embeddedPresets [ index ] ;
99
+ }
100
+ else
101
+ {
102
+ return null ;
103
+ }
85
104
}
86
105
87
- public void DeleteOrphanPresets ( string assetPath , HashSet < Preset > referencedPresets )
106
+ private EmbeddedPresets GetOrCreateEmbeddedPresets ( string assetPath )
88
107
{
89
108
var guid = new GUID ( AssetDatabase . AssetPathToGUID ( assetPath ) ) ;
90
- _embeddedPresets . RemoveAll ( p =>
109
+ int index = _embeddedPresets . BinarySearch ( new EmbeddedPresets { AssetGuid = guid } ) ;
110
+ if ( index >= 0 )
91
111
{
92
- bool shouldRemove = p . AssetGuid == guid && ! referencedPresets . Contains ( p . Preset ) ;
93
- if ( shouldRemove )
94
- {
95
- DestroyImmediate ( p . Preset , true ) ;
96
- }
97
- return shouldRemove ;
98
- } ) ;
112
+ return _embeddedPresets [ index ] ;
113
+ }
114
+ else
115
+ {
116
+ var embeddedPreset = new EmbeddedPresets { AssetGuid = guid , PresetList = new List < Preset > ( ) } ;
117
+ _embeddedPresets . Insert ( ~ index , embeddedPreset ) ;
118
+ return embeddedPreset ;
119
+ }
120
+ }
121
+
122
+ private void RemoveEmbeddedPresets ( string assetPath )
123
+ {
124
+ var guid = new GUID ( AssetDatabase . AssetPathToGUID ( assetPath ) ) ;
125
+ int index = _embeddedPresets . BinarySearch ( new EmbeddedPresets { AssetGuid = guid } ) ;
126
+ if ( index >= 0 )
127
+ {
128
+ _embeddedPresets . RemoveAt ( index ) ;
129
+ }
99
130
}
100
131
}
101
132
}
0 commit comments