diff --git a/Source/Editor/Scripting/ScriptType.cs b/Source/Editor/Scripting/ScriptType.cs
index 6d9db8ad6..ec3775b95 100644
--- a/Source/Editor/Scripting/ScriptType.cs
+++ b/Source/Editor/Scripting/ScriptType.cs
@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
+using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
@@ -671,6 +672,18 @@ namespace FlaxEditor.Scripting
/// The new member value.
public void SetValue(object obj, object value)
{
+ // Perform automatic conversion if type supports it
+ var type = ValueType.Type;
+ var valueType = value?.GetType();
+ if (valueType != null && type != null && valueType != type)
+ {
+ var converter = TypeDescriptor.GetConverter(type);
+ if (converter.CanConvertTo(type))
+ value = converter.ConvertTo(value, type);
+ else if (converter.CanConvertFrom(valueType))
+ value = converter.ConvertFrom(null, null, value);
+ }
+
if (_managed is PropertyInfo propertyInfo)
propertyInfo.SetValue(obj, value);
else if (_managed is FieldInfo fieldInfo)
diff --git a/Source/Engine/Content/JsonAssetReference.cs b/Source/Engine/Content/JsonAssetReference.cs
index 59cf55cc1..86ad9a087 100644
--- a/Source/Engine/Content/JsonAssetReference.cs
+++ b/Source/Engine/Content/JsonAssetReference.cs
@@ -1,6 +1,10 @@
// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
using System;
+#if FLAX_EDITOR
+using System.ComponentModel;
+using System.Globalization;
+#endif
using System.Runtime.CompilerServices;
namespace FlaxEngine
@@ -11,6 +15,7 @@ namespace FlaxEngine
/// Type of the asset instance type.
#if FLAX_EDITOR
[CustomEditor(typeof(FlaxEditor.CustomEditors.Editors.AssetRefEditor))]
+ [TypeConverter(typeof(TypeConverters.JsonAssetReferenceConverter))]
#endif
[Newtonsoft.Json.JsonConverter(typeof(Json.JsonAssetReferenceConverter))]
public struct JsonAssetReference : IComparable, IComparable>, IEquatable>
@@ -141,3 +146,33 @@ namespace FlaxEngine
}
}
}
+
+#if FLAX_EDITOR
+namespace FlaxEngine.TypeConverters
+{
+ internal class JsonAssetReferenceConverter : TypeConverter
+ {
+ ///
+ public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
+ {
+ if (value is string valueStr)
+ {
+ var result = Activator.CreateInstance(destinationType);
+ Json.JsonSerializer.ParseID(valueStr, out var id);
+ var asset = Content.LoadAsync(id);
+ destinationType.GetField("Asset").SetValue(result, asset);
+ return result;
+ }
+ return base.ConvertTo(context, culture, value, destinationType);
+ }
+
+ ///
+ public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
+ {
+ if (destinationType.Name.StartsWith("JsonAssetReference", StringComparison.Ordinal))
+ return true;
+ return base.CanConvertTo(context, destinationType);
+ }
+ }
+}
+#endif
diff --git a/Source/Engine/Serialization/JsonConverters.cs b/Source/Engine/Serialization/JsonConverters.cs
index 5be6a6a53..04a20fdb4 100644
--- a/Source/Engine/Serialization/JsonConverters.cs
+++ b/Source/Engine/Serialization/JsonConverters.cs
@@ -479,7 +479,7 @@ namespace FlaxEngine.Json
///
public override bool CanConvert(Type objectType)
{
- return objectType.Name.StartsWith("JsonAssetReference");
+ return objectType.Name.StartsWith("JsonAssetReference", StringComparison.Ordinal);
}
}