Files
PrinceOfGlory/Packages/jillejr.newtonsoft.json-for-unity.converters/UnityConverters/Scripting/LayerMaskConverter.cs
2026-03-03 03:15:46 +08:00

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);
}
}
}
}