Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [Serializable]
- public class Flat2DArray<T> : ISerializationCallbackReceiver
- {
- [SerializeField] T[] _items;
- [SerializeField] int _x;
- [SerializeField] int _y;
- public int X => _x;
- public int Y => _y;
- public T[] Items
- {
- get => _items;
- private set => _items = value;
- }
- public Flat2DArray(int x = 0, int y = 0)
- {
- _x = x;
- _y = y;
- Items = new T[X * Y];
- }
- public void ForEach(Action<int, int> action)
- {
- for (int x = 0; x < X; x++)
- for (int y = 0; y < Y; y++)
- action?.Invoke(x, y);
- }
- public T this[int x, int y]
- {
- get => Items[(x * Y) + y];
- set => Items[(x * Y) + y] = value;
- }
- public void OnBeforeSerialize() { }
- public void OnAfterDeserialize()
- {
- Items ??= new T[X * Y];
- var newSize = X * Y;
- int oldSize = Items.Length;
- Array.Resize(ref _items, newSize);
- if (newSize <= oldSize) return;
- for (int i = oldSize; i < newSize; i++) Items[i] = default;
- }
- public void Populate(T[] items)
- {
- if (items.Length < Items.Length)
- Array.Copy(items, _items, items.Length);
- }
- public class Flat2DArrayConverter : JsonConverter<Flat2DArray<T>>
- {
- public override void WriteJson(JsonWriter writer, Flat2DArray<T> value, JsonSerializer serializer)
- {
- writer.WriteStartObject();
- writer.WritePropertyName("x");
- writer.WriteValue(value._x);
- writer.WritePropertyName("y");
- writer.WriteValue(value._y);
- writer.WritePropertyName("items");
- serializer.Serialize(writer, value._items);
- writer.WriteEndObject();
- }
- public override Flat2DArray<T> ReadJson(JsonReader reader, Type objectType, Flat2DArray<T> existingValue, bool hasExistingValue, JsonSerializer serializer)
- {
- var x = 0;
- var y = 0;
- T[] items = null;
- while (reader.Read())
- {
- if (reader.TokenType == JsonToken.PropertyName)
- {
- var propertyName = reader.Value.ToString();
- reader.Read();
- switch (propertyName)
- {
- case "x":
- x = Convert.ToInt32(reader.Value);
- break;
- case "y":
- y = Convert.ToInt32(reader.Value);
- break;
- case "items":
- items = serializer.Deserialize<T[]>(reader);
- break;
- }
- }
- else if (reader.TokenType == JsonToken.EndObject)
- break;
- }
- return new Flat2DArray<T>(x, y) { _items = items };
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement