62 lines
1.9 KiB
C#
62 lines
1.9 KiB
C#
using System;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using Newtonsoft.Json.UnityConverters.Helpers;
|
|
using Unity.Collections;
|
|
using UnityEngine;
|
|
|
|
namespace Newtonsoft.Json.UnityConverters.Scripting
|
|
{
|
|
public class LayerMaskConverter : JsonConverter
|
|
{
|
|
public override bool CanConvert(Type objectType)
|
|
{
|
|
return objectType == typeof(LayerMask) || objectType == typeof(LayerMask?);
|
|
}
|
|
|
|
[return: MaybeNull]
|
|
public override object ReadJson(JsonReader reader, Type objectType, [AllowNull] object existingValue, JsonSerializer serializer)
|
|
{
|
|
if (reader.TokenType == JsonToken.Null)
|
|
{
|
|
return objectType == typeof(LayerMask?)
|
|
? (LayerMask?)null
|
|
: new LayerMask();
|
|
}
|
|
|
|
if (reader.TokenType == JsonToken.Integer)
|
|
{
|
|
return new LayerMask {
|
|
value = GetInt(reader.Value)
|
|
};
|
|
}
|
|
|
|
throw reader.CreateSerializationException($"Unexpected token when reading LayerMask. Expected 'null' or 'integer', got '{reader.TokenType}'.");
|
|
}
|
|
|
|
private static int GetInt(object value)
|
|
{
|
|
switch (value)
|
|
{
|
|
case int i: return i;
|
|
case uint ui: return checked((int)ui);
|
|
case long l: return checked((int)l);
|
|
case ulong ul: return checked((int)ul);
|
|
default: return 0;
|
|
}
|
|
}
|
|
|
|
public override void WriteJson(JsonWriter writer, [AllowNull] object value, JsonSerializer serializer)
|
|
{
|
|
if (value is null)
|
|
{
|
|
writer.WriteNull();
|
|
}
|
|
else
|
|
{
|
|
var layerMask = (LayerMask)value;
|
|
writer.WriteValue(layerMask.value);
|
|
}
|
|
}
|
|
}
|
|
}
|