2 using System
.Collections
;
3 using System
.Collections
.Generic
;
6 namespace UnityEngine
.Tilemaps
9 internal enum GridInformationType
20 [AddComponentMenu("Tilemap/Grid Information")]
21 public class GridInformation
: MonoBehaviour
, ISerializationCallbackReceiver
23 internal struct GridInformationValue
25 public GridInformationType type
;
30 internal struct GridInformationKey
32 public Vector3Int position
;
36 private Dictionary
<GridInformationKey
, GridInformationValue
> m_PositionProperties
= new Dictionary
<GridInformationKey
, GridInformationValue
>();
37 internal Dictionary
<GridInformationKey
, GridInformationValue
> PositionProperties
39 get { return m_PositionProperties; }
44 private List
<GridInformationKey
> m_PositionIntKeys
= new List
<GridInformationKey
>();
48 private List
<int> m_PositionIntValues
= new List
<int>();
52 private List
<GridInformationKey
> m_PositionStringKeys
= new List
<GridInformationKey
>();
56 private List
<String
> m_PositionStringValues
= new List
<String
>();
60 private List
<GridInformationKey
> m_PositionFloatKeys
= new List
<GridInformationKey
>();
64 private List
<float> m_PositionFloatValues
= new List
<float>();
68 private List
<GridInformationKey
> m_PositionDoubleKeys
= new List
<GridInformationKey
>();
72 private List
<Double
> m_PositionDoubleValues
= new List
<Double
>();
76 private List
<GridInformationKey
> m_PositionObjectKeys
= new List
<GridInformationKey
>();
80 private List
<Object
> m_PositionObjectValues
= new List
<Object
>();
84 private List
<GridInformationKey
> m_PositionColorKeys
= new List
<GridInformationKey
>();
88 private List
<Color
> m_PositionColorValues
= new List
<Color
>();
90 void ISerializationCallbackReceiver
.OnBeforeSerialize()
92 Grid grid
= GetComponentInParent
<Grid
>();
96 m_PositionIntKeys
.Clear();
97 m_PositionIntValues
.Clear();
98 m_PositionStringKeys
.Clear();
99 m_PositionStringValues
.Clear();
100 m_PositionFloatKeys
.Clear();
101 m_PositionFloatValues
.Clear();
102 m_PositionDoubleKeys
.Clear();
103 m_PositionDoubleValues
.Clear();
104 m_PositionObjectKeys
.Clear();
105 m_PositionObjectValues
.Clear();
106 m_PositionColorKeys
.Clear();
107 m_PositionColorValues
.Clear();
109 foreach (var kvp
in m_PositionProperties
)
111 switch (kvp
.Value
.type
)
113 case GridInformationType
.Integer
:
114 m_PositionIntKeys
.Add(kvp
.Key
);
115 m_PositionIntValues
.Add((int)kvp
.Value
.data
);
117 case GridInformationType
.String
:
118 m_PositionStringKeys
.Add(kvp
.Key
);
119 m_PositionStringValues
.Add(kvp
.Value
.data
as String
);
121 case GridInformationType
.Float
:
122 m_PositionFloatKeys
.Add(kvp
.Key
);
123 m_PositionFloatValues
.Add((float)kvp
.Value
.data
);
125 case GridInformationType
.Double
:
126 m_PositionDoubleKeys
.Add(kvp
.Key
);
127 m_PositionDoubleValues
.Add((double)kvp
.Value
.data
);
129 case GridInformationType
.Color
:
130 m_PositionColorKeys
.Add(kvp
.Key
);
131 m_PositionColorValues
.Add((Color
)kvp
.Value
.data
);
134 m_PositionObjectKeys
.Add(kvp
.Key
);
135 m_PositionObjectValues
.Add(kvp
.Value
.data
as Object
);
141 void ISerializationCallbackReceiver
.OnAfterDeserialize()
143 m_PositionProperties
.Clear();
144 for (int i
= 0; i
!= Math
.Min(m_PositionIntKeys
.Count
, m_PositionIntValues
.Count
); i
++)
146 GridInformationValue positionValue
;
147 positionValue
.type
= GridInformationType
.Integer
;
148 positionValue
.data
= m_PositionIntValues
[i
];
149 m_PositionProperties
.Add(m_PositionIntKeys
[i
], positionValue
);
151 for (int i
= 0; i
!= Math
.Min(m_PositionStringKeys
.Count
, m_PositionStringValues
.Count
); i
++)
153 GridInformationValue positionValue
;
154 positionValue
.type
= GridInformationType
.String
;
155 positionValue
.data
= m_PositionStringValues
[i
];
156 m_PositionProperties
.Add(m_PositionStringKeys
[i
], positionValue
);
158 for (int i
= 0; i
!= Math
.Min(m_PositionFloatKeys
.Count
, m_PositionFloatValues
.Count
); i
++)
160 GridInformationValue positionValue
;
161 positionValue
.type
= GridInformationType
.Float
;
162 positionValue
.data
= m_PositionFloatValues
[i
];
163 m_PositionProperties
.Add(m_PositionFloatKeys
[i
], positionValue
);
165 for (int i
= 0; i
!= Math
.Min(m_PositionDoubleKeys
.Count
, m_PositionDoubleValues
.Count
); i
++)
167 GridInformationValue positionValue
;
168 positionValue
.type
= GridInformationType
.Double
;
169 positionValue
.data
= m_PositionDoubleValues
[i
];
170 m_PositionProperties
.Add(m_PositionDoubleKeys
[i
], positionValue
);
172 for (int i
= 0; i
!= Math
.Min(m_PositionObjectKeys
.Count
, m_PositionObjectValues
.Count
); i
++)
174 GridInformationValue positionValue
;
175 positionValue
.type
= GridInformationType
.UnityObject
;
176 positionValue
.data
= m_PositionObjectValues
[i
];
177 m_PositionProperties
.Add(m_PositionObjectKeys
[i
], positionValue
);
179 for (int i
= 0; i
!= Math
.Min(m_PositionColorKeys
.Count
, m_PositionColorValues
.Count
); i
++)
181 GridInformationValue positionValue
;
182 positionValue
.type
= GridInformationType
.Color
;
183 positionValue
.data
= m_PositionColorValues
[i
];
184 m_PositionProperties
.Add(m_PositionColorKeys
[i
], positionValue
);
188 public bool SetPositionProperty
<T
>(Vector3Int position
, String name
, T positionProperty
)
190 throw new NotImplementedException("Storing this type is not accepted in GridInformation");
193 public bool SetPositionProperty(Vector3Int position
, String name
, int positionProperty
)
195 return SetPositionProperty(position
, name
, GridInformationType
.Integer
, positionProperty
);
198 public bool SetPositionProperty(Vector3Int position
, String name
, string positionProperty
)
200 return SetPositionProperty(position
, name
, GridInformationType
.String
, positionProperty
);
203 public bool SetPositionProperty(Vector3Int position
, String name
, float positionProperty
)
205 return SetPositionProperty(position
, name
, GridInformationType
.Float
, positionProperty
);
208 public bool SetPositionProperty(Vector3Int position
, String name
, double positionProperty
)
210 return SetPositionProperty(position
, name
, GridInformationType
.Double
, positionProperty
);
213 public bool SetPositionProperty(Vector3Int position
, String name
, UnityEngine
.Object positionProperty
)
215 return SetPositionProperty(position
, name
, GridInformationType
.UnityObject
, positionProperty
);
218 public bool SetPositionProperty(Vector3Int position
, String name
, Color positionProperty
)
220 return SetPositionProperty(position
, name
, GridInformationType
.Color
, positionProperty
);
223 private bool SetPositionProperty(Vector3Int position
, String name
, GridInformationType dataType
, System
.Object positionProperty
)
225 Grid grid
= GetComponentInParent
<Grid
>();
226 if (grid
!= null && positionProperty
!= null)
228 GridInformationKey positionKey
;
229 positionKey
.position
= position
;
230 positionKey
.name
= name
;
232 GridInformationValue positionValue
;
233 positionValue
.type
= dataType
;
234 positionValue
.data
= positionProperty
;
236 m_PositionProperties
[positionKey
] = positionValue
;
242 public T GetPositionProperty
<T
>(Vector3Int position
, String name
, T defaultValue
) where T
: UnityEngine
.Object
244 GridInformationKey positionKey
;
245 positionKey
.position
= position
;
246 positionKey
.name
= name
;
248 GridInformationValue positionValue
;
249 if (m_PositionProperties
.TryGetValue(positionKey
, out positionValue
))
251 if (positionValue
.type
!= GridInformationType
.UnityObject
)
252 throw new InvalidCastException("Value stored in GridInformation is not of the right type");
253 return positionValue
.data
as T
;
258 public int GetPositionProperty(Vector3Int position
, String name
, int defaultValue
)
260 GridInformationKey positionKey
;
261 positionKey
.position
= position
;
262 positionKey
.name
= name
;
264 GridInformationValue positionValue
;
265 if (m_PositionProperties
.TryGetValue(positionKey
, out positionValue
))
267 if (positionValue
.type
!= GridInformationType
.Integer
)
268 throw new InvalidCastException("Value stored in GridInformation is not of the right type");
269 return (int)positionValue
.data
;
274 public string GetPositionProperty(Vector3Int position
, String name
, string defaultValue
)
276 GridInformationKey positionKey
;
277 positionKey
.position
= position
;
278 positionKey
.name
= name
;
280 GridInformationValue positionValue
;
281 if (m_PositionProperties
.TryGetValue(positionKey
, out positionValue
))
283 if (positionValue
.type
!= GridInformationType
.String
)
284 throw new InvalidCastException("Value stored in GridInformation is not of the right type");
285 return (string)positionValue
.data
;
290 public float GetPositionProperty(Vector3Int position
, String name
, float defaultValue
)
292 GridInformationKey positionKey
;
293 positionKey
.position
= position
;
294 positionKey
.name
= name
;
296 GridInformationValue positionValue
;
297 if (m_PositionProperties
.TryGetValue(positionKey
, out positionValue
))
299 if (positionValue
.type
!= GridInformationType
.Float
)
300 throw new InvalidCastException("Value stored in GridInformation is not of the right type");
301 return (float)positionValue
.data
;
306 public double GetPositionProperty(Vector3Int position
, String name
, double defaultValue
)
308 GridInformationKey positionKey
;
309 positionKey
.position
= position
;
310 positionKey
.name
= name
;
312 GridInformationValue positionValue
;
313 if (m_PositionProperties
.TryGetValue(positionKey
, out positionValue
))
315 if (positionValue
.type
!= GridInformationType
.Double
)
316 throw new InvalidCastException("Value stored in GridInformation is not of the right type");
317 return (double)positionValue
.data
;
322 public Color
GetPositionProperty(Vector3Int position
, String name
, Color defaultValue
)
324 GridInformationKey positionKey
;
325 positionKey
.position
= position
;
326 positionKey
.name
= name
;
328 GridInformationValue positionValue
;
329 if (m_PositionProperties
.TryGetValue(positionKey
, out positionValue
))
331 if (positionValue
.type
!= GridInformationType
.Color
)
332 throw new InvalidCastException("Value stored in GridInformation is not of the right type");
333 return (Color
)positionValue
.data
;
338 public bool ErasePositionProperty(Vector3Int position
, String name
)
340 GridInformationKey positionKey
;
341 positionKey
.position
= position
;
342 positionKey
.name
= name
;
343 return m_PositionProperties
.Remove(positionKey
);
346 public virtual void Reset()
348 m_PositionProperties
.Clear();
351 public Vector3Int
[] GetAllPositions(string propertyName
)
353 return m_PositionProperties
.Keys
.ToList().FindAll(x
=> x
.name
== propertyName
).Select(x
=> x
.position
).ToArray();