com.wallstop-studios.unity-helpers 2.0.0-rc49 → 2.0.0-rc50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,88 @@
1
+ namespace UnityHelpers.Core.Serialization.JsonConverters
2
+ {
3
+ using System;
4
+ using System.Text.Json;
5
+ using System.Text.Json.Serialization;
6
+ using UnityEngine;
7
+
8
+ public sealed class ColorConverter : JsonConverter<Color>
9
+ {
10
+ public static readonly ColorConverter Instance = new();
11
+
12
+ private ColorConverter() { }
13
+
14
+ public override Color Read(
15
+ ref Utf8JsonReader reader,
16
+ Type typeToConvert,
17
+ JsonSerializerOptions options
18
+ )
19
+ {
20
+ if (reader.TokenType != JsonTokenType.StartObject)
21
+ {
22
+ throw new JsonException($"Invalid token type {reader.TokenType}");
23
+ }
24
+
25
+ float r = 0;
26
+ float g = 0;
27
+ float b = 0;
28
+ float a = 1;
29
+
30
+ while (reader.Read())
31
+ {
32
+ if (reader.TokenType == JsonTokenType.EndObject)
33
+ {
34
+ return new Color(r, g, b, a);
35
+ }
36
+
37
+ if (reader.TokenType == JsonTokenType.PropertyName)
38
+ {
39
+ string propertyName = reader.GetString();
40
+ reader.Read();
41
+ switch (propertyName)
42
+ {
43
+ case "r":
44
+ {
45
+ r = reader.GetSingle();
46
+ break;
47
+ }
48
+ case "g":
49
+ {
50
+ g = reader.GetSingle();
51
+ break;
52
+ }
53
+ case "b":
54
+ {
55
+ b = reader.GetSingle();
56
+ break;
57
+ }
58
+ case "a":
59
+ {
60
+ a = reader.GetSingle();
61
+ break;
62
+ }
63
+ default:
64
+ {
65
+ throw new JsonException($"Unknown property: {propertyName}");
66
+ }
67
+ }
68
+ }
69
+ }
70
+
71
+ throw new JsonException("Incomplete JSON for Color");
72
+ }
73
+
74
+ public override void Write(
75
+ Utf8JsonWriter writer,
76
+ Color value,
77
+ JsonSerializerOptions options
78
+ )
79
+ {
80
+ writer.WriteStartObject();
81
+ writer.WriteNumber("r", value.r);
82
+ writer.WriteNumber("g", value.g);
83
+ writer.WriteNumber("b", value.b);
84
+ writer.WriteNumber("a", value.a);
85
+ writer.WriteEndObject();
86
+ }
87
+ }
88
+ }
@@ -0,0 +1,3 @@
1
+ fileFormatVersion: 2
2
+ guid: 637013e97e6d436a880092e239d12e4e
3
+ timeCreated: 1743567974
@@ -0,0 +1,37 @@
1
+ namespace UnityHelpers.Core.Serialization.JsonConverters
2
+ {
3
+ using System;
4
+ using System.Text.Json;
5
+ using System.Text.Json.Serialization;
6
+ using UnityEngine;
7
+ using Object = UnityEngine.Object;
8
+
9
+ public sealed class GameObjectConverter : JsonConverter<GameObject>
10
+ {
11
+ public static readonly GameObjectConverter Instance = new();
12
+
13
+ private GameObjectConverter() { }
14
+
15
+ public override GameObject Read(
16
+ ref Utf8JsonReader reader,
17
+ Type typeToConvert,
18
+ JsonSerializerOptions options
19
+ )
20
+ {
21
+ throw new NotImplementedException(nameof(Read));
22
+ }
23
+
24
+ public override void Write(
25
+ Utf8JsonWriter writer,
26
+ GameObject value,
27
+ JsonSerializerOptions options
28
+ )
29
+ {
30
+ writer.WriteStringValue(
31
+ value == null
32
+ ? "{}"
33
+ : new { name = value.name, type = value.GetType().FullName }.ToString()
34
+ );
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,3 @@
1
+ fileFormatVersion: 2
2
+ guid: 6c12adc5c56c4be9bb536628749979b0
3
+ timeCreated: 1743567258
@@ -0,0 +1,218 @@
1
+ namespace UnityHelpers.Core.Serialization.JsonConverters
2
+ {
3
+ using System;
4
+ using System.Text.Json;
5
+ using System.Text.Json.Serialization;
6
+ using UnityEngine;
7
+
8
+ public sealed class Matrix4x4Converter : JsonConverter<Matrix4x4>
9
+ {
10
+ private static readonly string[] PropertyNames =
11
+ {
12
+ "m00",
13
+ "m01",
14
+ "m02",
15
+ "m03",
16
+ "m10",
17
+ "m11",
18
+ "m12",
19
+ "m13",
20
+ "m20",
21
+ "m21",
22
+ "m22",
23
+ "m23",
24
+ "m30",
25
+ "m31",
26
+ "m32",
27
+ "m33",
28
+ };
29
+
30
+ public static readonly Matrix4x4Converter Instance = new();
31
+
32
+ private Matrix4x4Converter() { }
33
+
34
+ public override Matrix4x4 Read(
35
+ ref Utf8JsonReader reader,
36
+ Type typeToConvert,
37
+ JsonSerializerOptions options
38
+ )
39
+ {
40
+ if (reader.TokenType != JsonTokenType.StartObject)
41
+ {
42
+ throw new JsonException("Expected StartObject token when parsing Matrix4x4.");
43
+ }
44
+
45
+ float m00 = 0;
46
+ float m01 = 0;
47
+ float m02 = 0;
48
+ float m03 = 0;
49
+ float m10 = 0;
50
+ float m11 = 0;
51
+ float m12 = 0;
52
+ float m13 = 0;
53
+ float m20 = 0;
54
+ float m21 = 0;
55
+ float m22 = 0;
56
+ float m23 = 0;
57
+ float m30 = 0;
58
+ float m31 = 0;
59
+ float m32 = 0;
60
+ float m33 = 0;
61
+
62
+ bool[] found = new bool[16];
63
+
64
+ while (reader.Read())
65
+ {
66
+ if (reader.TokenType == JsonTokenType.EndObject)
67
+ {
68
+ break;
69
+ }
70
+ if (reader.TokenType != JsonTokenType.PropertyName)
71
+ {
72
+ throw new JsonException("Expected property name in Matrix4x4 JSON.");
73
+ }
74
+ string propertyName = reader.GetString();
75
+ if (!reader.Read())
76
+ {
77
+ throw new JsonException($"Expected value for property '{propertyName}'.");
78
+ }
79
+ float value;
80
+ try
81
+ {
82
+ value = reader.GetSingle();
83
+ }
84
+ catch (Exception ex)
85
+ {
86
+ throw new JsonException($"Invalid value for property '{propertyName}'.", ex);
87
+ }
88
+ switch (propertyName)
89
+ {
90
+ case "m00":
91
+ m00 = value;
92
+ found[0] = true;
93
+ break;
94
+ case "m01":
95
+ m01 = value;
96
+ found[1] = true;
97
+ break;
98
+ case "m02":
99
+ m02 = value;
100
+ found[2] = true;
101
+ break;
102
+ case "m03":
103
+ m03 = value;
104
+ found[3] = true;
105
+ break;
106
+ case "m10":
107
+ m10 = value;
108
+ found[4] = true;
109
+ break;
110
+ case "m11":
111
+ m11 = value;
112
+ found[5] = true;
113
+ break;
114
+ case "m12":
115
+ m12 = value;
116
+ found[6] = true;
117
+ break;
118
+ case "m13":
119
+ m13 = value;
120
+ found[7] = true;
121
+ break;
122
+ case "m20":
123
+ m20 = value;
124
+ found[8] = true;
125
+ break;
126
+ case "m21":
127
+ m21 = value;
128
+ found[9] = true;
129
+ break;
130
+ case "m22":
131
+ m22 = value;
132
+ found[10] = true;
133
+ break;
134
+ case "m23":
135
+ m23 = value;
136
+ found[11] = true;
137
+ break;
138
+ case "m30":
139
+ m30 = value;
140
+ found[12] = true;
141
+ break;
142
+ case "m31":
143
+ m31 = value;
144
+ found[13] = true;
145
+ break;
146
+ case "m32":
147
+ m32 = value;
148
+ found[14] = true;
149
+ break;
150
+ case "m33":
151
+ m33 = value;
152
+ found[15] = true;
153
+ break;
154
+ }
155
+ }
156
+
157
+ for (int i = 0; i < found.Length; i++)
158
+ {
159
+ if (!found[i])
160
+ {
161
+ throw new JsonException(
162
+ $"Missing property '{PropertyNames[i]}' for Matrix4x4."
163
+ );
164
+ }
165
+ }
166
+
167
+ Matrix4x4 matrix = new()
168
+ {
169
+ m00 = m00,
170
+ m01 = m01,
171
+ m02 = m02,
172
+ m03 = m03,
173
+ m10 = m10,
174
+ m11 = m11,
175
+ m12 = m12,
176
+ m13 = m13,
177
+ m20 = m20,
178
+ m21 = m21,
179
+ m22 = m22,
180
+ m23 = m23,
181
+ m30 = m30,
182
+ m31 = m31,
183
+ m32 = m32,
184
+ m33 = m33,
185
+ };
186
+
187
+ return matrix;
188
+ }
189
+
190
+ public override void Write(
191
+ Utf8JsonWriter writer,
192
+ Matrix4x4 matrix,
193
+ JsonSerializerOptions options
194
+ )
195
+ {
196
+ writer.WriteStartObject();
197
+
198
+ writer.WriteNumber("m00", matrix.m00);
199
+ writer.WriteNumber("m01", matrix.m01);
200
+ writer.WriteNumber("m02", matrix.m02);
201
+ writer.WriteNumber("m03", matrix.m03);
202
+ writer.WriteNumber("m10", matrix.m10);
203
+ writer.WriteNumber("m11", matrix.m11);
204
+ writer.WriteNumber("m12", matrix.m12);
205
+ writer.WriteNumber("m13", matrix.m13);
206
+ writer.WriteNumber("m20", matrix.m20);
207
+ writer.WriteNumber("m21", matrix.m21);
208
+ writer.WriteNumber("m22", matrix.m22);
209
+ writer.WriteNumber("m23", matrix.m23);
210
+ writer.WriteNumber("m30", matrix.m30);
211
+ writer.WriteNumber("m31", matrix.m31);
212
+ writer.WriteNumber("m32", matrix.m32);
213
+ writer.WriteNumber("m33", matrix.m33);
214
+
215
+ writer.WriteEndObject();
216
+ }
217
+ }
218
+ }
@@ -0,0 +1,3 @@
1
+ fileFormatVersion: 2
2
+ guid: 456d0090c1d744de924e8f18a895b87b
3
+ timeCreated: 1743568330
@@ -22,8 +22,8 @@
22
22
  throw new JsonException($"Invalid token type {reader.TokenType}");
23
23
  }
24
24
 
25
- float x = 0,
26
- y = 0;
25
+ float x = 0;
26
+ float y = 0;
27
27
 
28
28
  while (reader.Read())
29
29
  {
@@ -22,9 +22,9 @@
22
22
  throw new JsonException($"Invalid token type {reader.TokenType}");
23
23
  }
24
24
 
25
- float x = 0,
26
- y = 0,
27
- z = 0;
25
+ float x = 0;
26
+ float y = 0;
27
+ float z = 0;
28
28
 
29
29
  while (reader.Read())
30
30
  {
@@ -0,0 +1,88 @@
1
+ namespace UnityHelpers.Core.Serialization.JsonConverters
2
+ {
3
+ using System;
4
+ using System.Text.Json;
5
+ using System.Text.Json.Serialization;
6
+ using UnityEngine;
7
+
8
+ public sealed class Vector4Converter : JsonConverter<Vector4>
9
+ {
10
+ public static readonly Vector4Converter Instance = new();
11
+
12
+ private Vector4Converter() { }
13
+
14
+ public override Vector4 Read(
15
+ ref Utf8JsonReader reader,
16
+ Type typeToConvert,
17
+ JsonSerializerOptions options
18
+ )
19
+ {
20
+ if (reader.TokenType != JsonTokenType.StartObject)
21
+ {
22
+ throw new JsonException($"Invalid token type {reader.TokenType}");
23
+ }
24
+
25
+ float x = 0;
26
+ float y = 0;
27
+ float z = 0;
28
+ float w = 0;
29
+
30
+ while (reader.Read())
31
+ {
32
+ if (reader.TokenType == JsonTokenType.EndObject)
33
+ {
34
+ return new Vector4(x, y, z, w);
35
+ }
36
+
37
+ if (reader.TokenType == JsonTokenType.PropertyName)
38
+ {
39
+ string propertyName = reader.GetString();
40
+ reader.Read();
41
+ switch (propertyName)
42
+ {
43
+ case "x":
44
+ {
45
+ x = reader.GetSingle();
46
+ break;
47
+ }
48
+ case "y":
49
+ {
50
+ y = reader.GetSingle();
51
+ break;
52
+ }
53
+ case "z":
54
+ {
55
+ z = reader.GetSingle();
56
+ break;
57
+ }
58
+ case "w":
59
+ {
60
+ w = reader.GetSingle();
61
+ break;
62
+ }
63
+ default:
64
+ {
65
+ throw new JsonException($"Unknown property: {propertyName}");
66
+ }
67
+ }
68
+ }
69
+ }
70
+
71
+ throw new JsonException("Incomplete JSON for Vector4");
72
+ }
73
+
74
+ public override void Write(
75
+ Utf8JsonWriter writer,
76
+ Vector4 value,
77
+ JsonSerializerOptions options
78
+ )
79
+ {
80
+ writer.WriteStartObject();
81
+ writer.WriteNumber("x", value.x);
82
+ writer.WriteNumber("y", value.y);
83
+ writer.WriteNumber("z", value.z);
84
+ writer.WriteNumber("w", value.w);
85
+ writer.WriteEndObject();
86
+ }
87
+ }
88
+ }
@@ -0,0 +1,3 @@
1
+ fileFormatVersion: 2
2
+ guid: 89ed188581124a3abc07f3645220ef56
3
+ timeCreated: 1743568183
@@ -32,7 +32,11 @@
32
32
  new JsonStringEnumConverter(),
33
33
  Vector3Converter.Instance,
34
34
  Vector2Converter.Instance,
35
+ Vector4Converter.Instance,
36
+ Matrix4x4Converter.Instance,
35
37
  TypeConverter.Instance,
38
+ GameObjectConverter.Instance,
39
+ ColorConverter.Instance,
36
40
  },
37
41
  };
38
42
 
@@ -48,7 +52,11 @@
48
52
  new JsonStringEnumConverter(),
49
53
  Vector3Converter.Instance,
50
54
  Vector2Converter.Instance,
55
+ Vector4Converter.Instance,
56
+ Matrix4x4Converter.Instance,
51
57
  TypeConverter.Instance,
58
+ GameObjectConverter.Instance,
59
+ ColorConverter.Instance,
52
60
  },
53
61
  WriteIndented = true,
54
62
  };
@@ -6,9 +6,11 @@
6
6
  using System.Runtime.Serialization;
7
7
  using System.Text.Json.Serialization;
8
8
  using Core.Extension;
9
+ using Core.Helper;
9
10
  using Core.Random;
10
11
  using Core.Serialization;
11
12
  using NUnit.Framework;
13
+ using UnityEngine;
12
14
 
13
15
  [DataContract]
14
16
  public sealed class TestDataObject
@@ -26,8 +28,69 @@
26
28
  public List<Type> TypeProperties { get; set; } = new();
27
29
  }
28
30
 
29
- public class JsonSerializationTest
31
+ public sealed class JsonSerializationTest
30
32
  {
33
+ [Test]
34
+ public void UnityEngineObjectSerializationWorks()
35
+ {
36
+ GameObject testGo = new("Test GameObject", typeof(SpriteRenderer));
37
+ string json = testGo.ToJson();
38
+ Assert.IsFalse(string.IsNullOrWhiteSpace(json), json);
39
+ Assert.AreNotEqual("{}", json);
40
+ Assert.IsTrue(json.Contains("name = Test GameObject"), json);
41
+ Assert.IsTrue(json.Contains("type = UnityEngine.GameObject"), json);
42
+ }
43
+
44
+ [Test]
45
+ public void NullGameObjectSerializationWorks()
46
+ {
47
+ GameObject testGo = null;
48
+ string json = testGo.ToJson();
49
+ Assert.AreEqual("null", json);
50
+
51
+ testGo = new GameObject();
52
+ testGo.Destroy();
53
+ Assert.IsFalse(string.IsNullOrWhiteSpace(json), json);
54
+ Assert.AreEqual("null", json);
55
+ }
56
+
57
+ [Test]
58
+ public void TransformSerializationWorks()
59
+ {
60
+ GameObject testGo = new("Test GameObject", typeof(SpriteRenderer));
61
+ Transform transform = testGo.transform;
62
+ string json = transform.ToJson();
63
+ Assert.AreEqual("[]", json);
64
+ }
65
+
66
+ [Test]
67
+ public void ColorSerializationWorks()
68
+ {
69
+ Color color = new(0.5f, 0.5f, 0.5f, 0.5f);
70
+ string json = color.ToJson();
71
+ Color deserialized = Serializer.JsonDeserialize<Color>(json);
72
+ Assert.AreEqual(color, deserialized);
73
+
74
+ color = new Color(0.7f, 0.1f, 0.3f);
75
+ json = color.ToJson();
76
+ deserialized = Serializer.JsonDeserialize<Color>(json);
77
+ Assert.AreEqual(color, deserialized);
78
+ }
79
+
80
+ [Test]
81
+ public void Vector4SerializationWorks()
82
+ {
83
+ Vector4 vector = new(0.5f, 0.5f, 0.5f, 0.5f);
84
+ string json = vector.ToJson();
85
+ Vector4 deserialized = Serializer.JsonDeserialize<Vector4>(json);
86
+ Assert.AreEqual(vector, deserialized);
87
+
88
+ vector = new Vector4(0.7f, 0.1f, 0.3f);
89
+ json = vector.ToJson();
90
+ deserialized = Serializer.JsonDeserialize<Vector4>(json);
91
+ Assert.AreEqual(vector, deserialized);
92
+ }
93
+
31
94
  [Test]
32
95
  public void SerializationWorks()
33
96
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "com.wallstop-studios.unity-helpers",
3
- "version": "2.0.0-rc49",
3
+ "version": "2.0.0-rc50",
4
4
  "displayName": "Unity Helpers",
5
5
  "description": "Various Unity Helper Library",
6
6
  "dependencies": {},