protected virtual void Start() { m_parentDialog = GetComponentInParent <Dialog>(); if (m_parentDialog != null) { m_parentDialog.IsOkVisible = true; } HashSet <string> alreadyAddedHs = new HashSet <string>(); RuntimeAnimationProperty[] alreadyAddedProperties = View.Props; for (int i = 0; i < alreadyAddedProperties.Length; ++i) { RuntimeAnimationProperty property = alreadyAddedProperties[i]; alreadyAddedHs.Add(property.ComponentTypeName + " " + property.PropertyName); } MemberInfo enabledProperty = Strong.MemberInfo((Behaviour x) => x.enabled); List <RuntimeAnimationProperty> components = new List <RuntimeAnimationProperty>(); IEditorsMap editorsMap = IOC.Resolve <IEditorsMap>(); Type[] editableTypes = editorsMap.GetEditableTypes(); for (int i = 0; i < editableTypes.Length; ++i) { Type editableType = editableTypes[i]; if (!(typeof(Component).IsAssignableFrom(editableType)) || typeof(Component) == editableType) { continue; } Component targetComponent = Target.GetComponent(editableType); if (targetComponent == null) { continue; } m_voidComponentEditor.Components = new[] { targetComponent }; RuntimeAnimationProperty component = new RuntimeAnimationProperty(); component.ComponentDisplayName = editableType.Name; component.ComponentTypeName = string.Format("{0},{1}", editableType.FullName, editableType.Assembly.FullName.Split(',')[0]); component.Children = new List <RuntimeAnimationProperty>(); component.Component = m_voidComponentEditor.Components[0]; PropertyDescriptor[] propertyDescriptors = editorsMap.GetPropertyDescriptors(editableType, m_voidComponentEditor); for (int j = 0; j < propertyDescriptors.Length; ++j) { PropertyDescriptor propertyDescriptor = propertyDescriptors[j]; Type memberType = propertyDescriptor.MemberType; if (memberType.IsClass || memberType.IsEnum || typeof(MonoBehaviour).IsAssignableFrom(editableType) && propertyDescriptor.MemberInfo is PropertyInfo) { continue; } if (alreadyAddedHs.Contains(component.ComponentTypeName + " " + propertyDescriptor.MemberInfo.Name)) { continue; } RuntimeAnimationProperty property = new RuntimeAnimationProperty(); property.Parent = component; property.ComponentTypeName = component.ComponentTypeName; property.ComponentDisplayName = component.ComponentDisplayName; property.PropertyName = propertyDescriptor.MemberInfo.Name; property.PropertyDisplayName = propertyDescriptor.Label; if (propertyDescriptor.MemberInfo.Name == enabledProperty.Name && propertyDescriptor.MemberInfo.DeclaringType == enabledProperty.DeclaringType) { property.AnimationPropertyName = "m_Enabled"; } else { if (string.IsNullOrEmpty(propertyDescriptor.AnimationPropertyName)) { Type componentType = property.ComponentType; if (typeof(Component).IsAssignableFrom(componentType) && !typeof(MonoBehaviour).IsAssignableFrom(componentType)) { //Trying to derive serialized property name string aPropName = propertyDescriptor.MemberInfo.Name; property.AnimationPropertyName = "m_" + Char.ToUpper(aPropName[0]) + aPropName.Substring(1); } else { property.AnimationPropertyName = propertyDescriptor.MemberInfo.Name; } } else { property.AnimationPropertyName = propertyDescriptor.AnimationPropertyName; } } property.Component = propertyDescriptor.Target; component.Children.Add(property); } if (component.Children.Count > 0) { components.Add(component); } m_voidComponentEditor.Components = null; } m_propertiesTreeView.Items = components; }