/* ┌──────────────────────────────────────────────────────────────────┐ │ Author: Ivan Murzak (https://github.com/IvanMurzak) │ │ Repository: GitHub (https://github.com/IvanMurzak/Unity-MCP) │ │ Copyright (c) 2025 Ivan Murzak │ │ Licensed under the Apache License, Version 2.0. │ │ See the LICENSE file in the project root for more information. │ └──────────────────────────────────────────────────────────────────┘ */ #nullable enable using System; using System.Reflection; using com.IvanMurzak.ReflectorNet; using com.IvanMurzak.ReflectorNet.Model; using AIGD; using ILogger = Microsoft.Extensions.Logging.ILogger; namespace com.IvanMurzak.Unity.MCP.Reflection.Converter { /// /// Reflection converter for UnityEngine.Object /// IMPORTANT: it implements custom depth handling to avoid heavy serialization of Unity objects. /// As a result it only serializes a UnityEngine.Object at depth == 0 /// public partial class UnityEngine_Object_ReflectionConverter { protected override SerializedMember InternalSerialize( Reflector reflector, object? obj, Type type, string? name = null, bool recursive = true, BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, int depth = 0, Logs? logs = null, ILogger? logger = null, SerializationContext? context = null) { // UnityEngine.Debug.LogWarning($"Serialize: {name}, Type: {(obj?.GetType() ?? type).GetTypeId()}, Obj is null? {obj == null}.\nPath: {context?.BuildCurrentPath()}"); if (obj == null) return SerializedMember.Null(type, name); var unityObject = obj as T; if (unityObject == null) { // UnityEngine.Object is destroyed but reference is not null return SerializedMember.Null(type, name); } if (!type.IsClass && !type.IsInterface) throw new ArgumentException($"Unsupported type: '{type.GetTypeId()}'. Converter: {GetType().GetTypeShortName()}"); if (depth >= 1 || !recursive) { var objectRef = new ObjectRef(unityObject); return SerializedMember.FromValue( reflector: reflector, type: type, value: objectRef, name: name ?? unityObject.name); } return new SerializedMember() { name = name ?? unityObject.name, typeName = type.GetTypeId(), fields = SerializeFields( reflector, obj: obj, flags: flags, depth: depth + 1, logs: logs, logger: logger, context: context), props = SerializeProperties( reflector, obj: obj, flags: flags, depth: depth + 1, logs: logs, logger: logger, context: context) }.SetValue(reflector, new ObjectRef(unityObject)); } } }