private void CreateSharedVariableUI(Type type, object obj, VisualElement container) { var fields = NodeSerializer.GetSerializedFields(type); foreach (var fInfo in fields) { var foldout = new Foldout { text = ObjectNames.NicifyVariableName(fInfo.Name) }; if (fInfo.FieldType != typeof(SharedVariable)) { if (((!fInfo.FieldType.IsAbstract && fInfo.FieldType.IsSerializable) || NodeSerializer.IsTaskReference(fInfo.FieldType)) && !fInfo.FieldType.Namespace.StartsWith("System")) { var target = fInfo.GetValue(obj) ?? NodeSerializer.CreateTypeInstance(fInfo.FieldType); fInfo.SetValue(obj, target); var name = $"unity-foldout-Selected.Data.{fInfo.Name}"; var existing = container.Q(name); if (existing != null) { if (NodeSerializer.IsTaskReference(fInfo.FieldType)) { CreateTaskReferenceUI(fInfo.FieldType, fInfo, obj, existing); } else if (fInfo.FieldType.IsSerializable) { CreateSharedVariableUI(fInfo.FieldType, target, existing); } } else { existing = new Foldout { text = ObjectNames.NicifyVariableName(fInfo.Name) }; if (NodeSerializer.IsTaskReference(fInfo.FieldType)) { CreateTaskReferenceUI(fInfo.FieldType, fInfo, obj, existing); } else if (fInfo.FieldType.IsSerializable) { CreateSharedVariableUI(fInfo.FieldType, target, existing); } if (existing.childCount > 0) { container.Add(existing); } } existing.MarkDirtyRepaint(); } continue; } var choices = _inspectorObject?.View?.Properties?.Select(x => x.Name).ToList() ?? new List <string>(); choices.Insert(0, "None"); var value = fInfo.GetValue(obj) as SharedVariable; var index = choices.IndexOf(value?.Name); if (index < 0) { index = 0; } var popup = new PopupField <string>("Variable", choices, index); var tooltip = fInfo.GetCustomAttribute <TooltipAttribute>(); if (tooltip != null) { popup.tooltip = tooltip.Tooltip; } popup.RegisterValueChangedCallback(ev => { if (value == null) { var propType = _inspectorObject.View.Properties.FirstOrDefault(x => x.Name == ev.newValue)?.Type; if (propType != null) { value = Activator.CreateInstance(propType) as SharedVariable; } } value.Name = ev.newValue; value.IsShared = value.Name != "None"; fInfo.SetValue(obj, value); serializedObject.ApplyModifiedProperties(); }); foldout.Add(popup); container.Add(foldout); } }