Files
AR-Menu/Library/PackageCache/com.needle.engine-exporter@8c046140a1d9/Addressables/Editor/AddressableReferenceResolver.cs
2025-11-30 08:35:03 +02:00

83 lines
2.0 KiB
C#

#if HAS_ADDRESSABLES
using System.Collections.Generic;
using System.Reflection;
using JetBrains.Annotations;
using Needle.Engine.Components;
using Needle.Engine.Core.References.ReferenceResolvers;
using Needle.Engine.Gltf;
using UnityEngine;
namespace Needle.Engine.Addressables
{
[UsedImplicitly]
public class AddressableReferenceResolver : GltfExtensionHandlerBase, IValueResolver
{
public bool TryGetValue(IExportContext ctx, object instance, MemberInfo member, ref object value)
{
return Handle(ctx, instance, ref value);
}
private static bool Handle(IExportContext context, object owner, ref object result)
{
var path = default(string);
if (result is UnityEngine.AddressableAssets.AssetReference ar)
{
if (TryExportAssetReference(ar, owner, context, ref path))
{
result = path;
return true;
}
}
else if (result is IList<UnityEngine.AddressableAssets.AssetReference> list)
{
var exportedList = new List<string>();
foreach (var e in list)
{
path = default;
if (TryExportAssetReference(e, owner, context, ref path))
exportedList.Add(path);
}
if (exportedList.Count > 0)
{
result = exportedList;
return true;
}
}
return false;
}
private static bool TryExportAssetReference(UnityEngine.AddressableAssets.AssetReference ar, object owner, IExportContext context, ref string res)
{
var asset = ar.editorAsset;
var go = asset as GameObject;
if (!asset || !go)
{
res = null;
return false;
}
var exp = default(IExportableObject);
var addedExportable = false;
try
{
// for addressables ensure that the thing is exportable
if (!go.TryGetComponent(out exp))
{
var obj = go.AddComponent<GltfObject>();
exp = obj;
addedExportable = true;
}
return GltfReferenceResolver.ExportReferencedObject(owner, go, go, exp, context, ref res);
}
finally
{
if (addedExportable && exp is Object addedObject)
{
Object.DestroyImmediate(addedObject, true);
}
}
}
}
}
#endif