private void Decouple(SmartReferenceBase toDecouple, List <Component> components) { SmartReferenceBase copied = Instantiate(toDecouple); foreach (Component component in components) { System.Type type = component.GetType(); FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); foreach (FieldInfo field in fields) { //In case of a smart reference - replace the reference inside if (field.FieldType.IsSubclassOf(typeof(SmartVariableBase))) { object smartVariable = field.GetValue(component); System.Type typeTest = smartVariable.GetType(); PropertyInfo referenceFieldfInSmartVariable = typeTest.GetProperty("Reference"); #pragma warning disable CS0252 // Possible unintended reference comparison; It is completely intended if (referenceFieldfInSmartVariable.GetValue(smartVariable, null) == toDecouple) { referenceFieldfInSmartVariable.SetValue(smartVariable, copied, null); } } else if (field.GetValue(component) == toDecouple) #pragma warning restore CS0252 { field.SetValue(component, copied); } } } }
public void OnAssetAddedToCollection(Object asset) { #if UNITY_EDITOR SmartReferenceBase addedVariable = asset as SmartReferenceBase; if (addedVariable != null) { variables.Add(addedVariable); if (variableSaver != null) { addedVariable.VariableSaver = variableSaver; } return; } SmartVariableSaverBase addedVariableSaver = asset as SmartVariableSaverBase; if (addedVariableSaver != null) { if (variableSaver != null) { } else { variableSaver = addedVariableSaver; foreach (SmartReferenceBase variable in variables) { variable.VariableSaver = addedVariableSaver; } } return; } #endif }
void OnGUI() { if (Selection.activeGameObject == null) { return; } SmartReferenceBase selectedVariable = Selection.activeObject as SmartReferenceBase; if (selectedVariable != null) { Debug.Log("Tranalksnad"); } List <SmartLocalCollection> visibleCollections = new List <SmartLocalCollection>(); List <SmartLocalCollection> parentCollections = new List <SmartLocalCollection>(); Selection.activeGameObject.GetComponentsInChildren(true, visibleCollections); Selection.activeGameObject.GetComponentsInParent(true, parentCollections); visibleCollections.AddRange(parentCollections.Where(x => !visibleCollections.Contains(x))); Editor collectionEditor = null; foreach (SmartLocalCollection collection in visibleCollections) { DrawVariableCollection(collection, ref collectionEditor); } DestroyImmediate(collectionEditor); }
public void AddToCollection(SmartReferenceBase variable) { #if UNITY_EDITOR string oldPath = AssetDatabase.GetAssetPath(variable); variables.Add(variable); AssetDatabase.RemoveObjectFromAsset(variable); if (AssetDatabase.LoadAllAssetsAtPath(oldPath).Length == 0) { AssetDatabase.DeleteAsset(oldPath); } AssetDatabase.SaveAssets(); #endif }
public override void OnInspectorGUI() { SmartLocalCollection collection = target as SmartLocalCollection; //Drag in variable to add Object draggedInObject = EditorGUILayout.ObjectField("Add To Collection", null, typeof(SmartReferenceBase), false); SmartReferenceBase draggedInVariable = draggedInObject as SmartReferenceBase; if (draggedInVariable != null) { collection.AddToCollection(draggedInVariable); } //Draw foldout editors for variables Editor editor = null; foreach (SmartReferenceBase variable in collection.variables) { Editor.CreateCachedEditor(variable, typeof(SmartReferenceLocalEditor), ref editor); DrawFoldoutInspector(variable, ref editor); } DestroyImmediate(editor); }
public void OnAssetRemovedFromCollection(Object asset) { #if UNITY_EDITOR SmartVariableSaverBase removedVariableSaver = asset as SmartVariableSaverBase; if (removedVariableSaver != null) { foreach (SmartReferenceBase variable in variables) { variable.VariableSaver = null; } variableSaver = null; return; } SmartReferenceBase removedVariable = asset as SmartReferenceBase; if (removedVariable != null) { removedVariable.VariableSaver = null; variables.Remove(removedVariable); return; } #endif }