diff --git a/Source/Editor/CustomEditors/Editors/ArrayEditor.cs b/Source/Editor/CustomEditors/Editors/ArrayEditor.cs
index f12dadde1..335fd64a7 100644
--- a/Source/Editor/CustomEditors/Editors/ArrayEditor.cs
+++ b/Source/Editor/CustomEditors/Editors/ArrayEditor.cs
@@ -2,6 +2,7 @@
using System;
using System.Collections;
+using FlaxEditor.Scripting;
using FlaxEngine;
namespace FlaxEditor.CustomEditors.Editors
@@ -48,6 +49,15 @@ namespace FlaxEditor.CustomEditors.Editors
Array.Copy(array, oldSize - 1, newValues, i, 1);
}
}
+ else if (newSize > 0)
+ {
+ // Initialize new entries with default values
+ var defaultValue = TypeUtils.GetDefaultValue(new ScriptType(elementType));
+ for (int i = 0; i < newSize; i++)
+ {
+ newValues.SetValue(defaultValue, i);
+ }
+ }
SetValue(newValues);
}
diff --git a/Source/Editor/CustomEditors/Editors/ListEditor.cs b/Source/Editor/CustomEditors/Editors/ListEditor.cs
index 305d2e2c9..19ed9675b 100644
--- a/Source/Editor/CustomEditors/Editors/ListEditor.cs
+++ b/Source/Editor/CustomEditors/Editors/ListEditor.cs
@@ -58,7 +58,7 @@ namespace FlaxEditor.CustomEditors.Editors
}
else if (newSize > 0)
{
- // Fill new entries
+ // Fill new entries with default value
var defaultValue = Scripting.TypeUtils.GetDefaultValue(ElementType);
for (int i = oldSize; i < newSize; i++)
{
diff --git a/Source/Editor/Scripting/TypeUtils.cs b/Source/Editor/Scripting/TypeUtils.cs
index 70108f06f..60f64ab8e 100644
--- a/Source/Editor/Scripting/TypeUtils.cs
+++ b/Source/Editor/Scripting/TypeUtils.cs
@@ -59,11 +59,19 @@ namespace FlaxEditor.Scripting
if (type.Type == typeof(MaterialSceneTextures))
return MaterialSceneTextures.BaseColor;
if (type.IsValueType)
- return type.CreateInstance();
+ {
+ var value = type.CreateInstance();
+ Utilities.Utils.InitDefaultValues(value);
+ return value;
+ }
if (new ScriptType(typeof(object)).IsAssignableFrom(type))
return null;
if (type.CanCreateInstance)
- return type.CreateInstance();
+ {
+ var value = type.CreateInstance();
+ Utilities.Utils.InitDefaultValues(value);
+ return value;
+ }
throw new NotSupportedException("Cannot create default value for type " + type);
}
diff --git a/Source/Editor/Utilities/Utils.cs b/Source/Editor/Utilities/Utils.cs
index 5f1636239..cd9935da3 100644
--- a/Source/Editor/Utilities/Utils.cs
+++ b/Source/Editor/Utilities/Utils.cs
@@ -4,6 +4,7 @@ using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
+using System.Reflection;
using System.Runtime.InteropServices;
using FlaxEditor.SceneGraph;
using FlaxEditor.Scripting;
@@ -1732,5 +1733,44 @@ namespace FlaxEditor.Utilities
distance = 0;
return false;
}
+
+ ///
+ /// Initializes the object fields and properties with their default values based on .
+ ///
+ /// The object.
+ public static void InitDefaultValues(object obj)
+ {
+ var scriptType = TypeUtils.GetObjectType(obj);
+ if (!scriptType)
+ return;
+ var isStructure = scriptType.IsStructure;
+
+ var fields = scriptType.GetFields(BindingFlags.Default | BindingFlags.Instance | BindingFlags.Public);
+ for (var i = 0; i < fields.Length; i++)
+ {
+ var field = fields[i];
+ var attr = field.GetAttribute();
+ if (attr != null)
+ {
+ field.SetValue(obj, attr.Value);
+ }
+ else if (isStructure)
+ {
+ // C# doesn't support default values for structure members so initialize them
+ field.SetValue(obj, TypeUtils.GetDefaultValue(field.ValueType));
+ }
+ }
+
+ var properties = scriptType.GetProperties(BindingFlags.Default | BindingFlags.Instance | BindingFlags.Public);
+ for (var i = 0; i < properties.Length; i++)
+ {
+ var property = properties[i];
+ var attr = property.GetAttribute();
+ if (attr != null)
+ {
+ property.SetValue(obj, attr.Value);
+ }
+ }
+ }
}
}