public void OneTimeSetup() { guidManager = new GuidManager(); guidManagerMock = new GuidManagerMock(); // set mock guid manager as singleton so guid components will not conflict it test cases. GuidManagerSingleton.SetInstance(guidManagerMock); }
public void OneTimeSetup() { GuidManagerSingleton.SetInstance(new GuidManager()); guidBase = CreateNewGuid(); prefab = PrefabUtility.CreatePrefab(PrefabPath, guidBase.gameObject); guidPrefab = prefab.GetComponent <GuidComponent>(); }
/// <summary> /// Generates new Guid. Be careful with this method. It should be called only in specific cases. /// </summary> public void RegenerateGuid() { GuidManagerSingleton.Remove(guid); serializedGuid = null; guid = System.Guid.Empty; cachedStringGuid = null; CreateGuid(); }
public void GuidComponent_RaisesRemovedCallback_WhenDestroyed() { var guidComponent = CreateNewGuid(); int removeCallbackCount = 0; GuidManagerSingleton.ResolveGuid(guidComponent.GetGuid(), () => removeCallbackCount++); var guid = guidComponent.GetGuid(); Object.DestroyImmediate(guidComponent.gameObject); Assert.AreEqual(1, removeCallbackCount); }
private void Awake() { if (guidProviderAsset == null) { Debug.LogError("Guid provider asset is missing.", this); return; } if (!GuidManagerSingleton.Add(guidProviderAsset.GetGuid(), gameObject)) { Debug.LogError($"There are another game object with the same Guid: {guidProviderAsset.GetGuid()}. " + $"Guid provider asset: {guidProviderAsset.name}.", this); } }
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { guidProp = property.FindPropertyRelative("serializedGuid"); nameProp = property.FindPropertyRelative("cachedName"); sceneProp = property.FindPropertyRelative("cachedScene"); // Using BeginProperty / EndProperty on the parent property means that // prefab override logic works on the entire property. EditorGUI.BeginProperty(position, label, property); position.height = EditorGUIUtility.singleLineHeight; // Draw prefix label, returning the new rect we can draw in var guidCompPosition = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); System.Guid currentGuid; GameObject currentGO = null; // working with array properties is a bit unwieldy // you have to get the property at each index manually byte[] byteArray = new byte[16]; int arraySize = guidProp.arraySize; for (int i = 0; i < arraySize; ++i) { var byteProp = guidProp.GetArrayElementAtIndex(i); byteArray[i] = (byte)byteProp.intValue; } currentGuid = new System.Guid(byteArray); currentGO = GuidManagerSingleton.ResolveGuid(currentGuid); GuidComponent currentGuidComponent = currentGO != null?currentGO.GetComponent <GuidComponent>() : null; GuidComponent component = null; if (currentGuid != System.Guid.Empty && currentGuidComponent == null) { // if our reference is set, but the target isn't loaded, we display the target and the scene it is in, and provide a way to clear the reference float buttonWidth = 55.0f; guidCompPosition.xMax -= buttonWidth; bool guiEnabled = GUI.enabled; GUI.enabled = false; EditorGUI.LabelField(guidCompPosition, new GUIContent(nameProp.stringValue, "Target GameObject is not currently loaded."), EditorStyles.objectField); GUI.enabled = guiEnabled; Rect clearButtonRect = new Rect(guidCompPosition); clearButtonRect.xMin = guidCompPosition.xMax; clearButtonRect.xMax += buttonWidth; if (GUI.Button(clearButtonRect, clearButtonGUI, EditorStyles.miniButton)) { ClearPreviousGuid(); } } else { // if our object is loaded, we can simply use an object field directly component = EditorGUI.ObjectField(guidCompPosition, currentGuidComponent, typeof(GuidComponent), true) as GuidComponent; } if (currentGuidComponent != null && component == null) { ClearPreviousGuid(); } // if we have a valid reference, draw the scene name of the scene it lives in so users can find it if (component != null) { nameProp.stringValue = component.name; string scenePath = component.gameObject.scene.path; sceneProp.objectReferenceValue = AssetDatabase.LoadAssetAtPath <SceneAsset>(scenePath); // only update the GUID Prop if something changed. This fixes multi-edit on GUID References if (component != currentGuidComponent) { byteArray = component.GetGuid().ToByteArray(); arraySize = guidProp.arraySize; for (int i = 0; i < arraySize; ++i) { var byteProp = guidProp.GetArrayElementAtIndex(i); byteProp.intValue = byteArray[i]; } } } EditorGUI.indentLevel++; position.y += EditorGUIUtility.singleLineHeight; bool cachedGUIState = GUI.enabled; GUI.enabled = false; EditorGUI.ObjectField(position, sceneLabel, sceneProp.objectReferenceValue, typeof(SceneAsset), false); GUI.enabled = cachedGUIState; EditorGUI.indentLevel--; EditorGUI.EndProperty(); }
public void OneTimeTearDown() { GuidManagerSingleton.SetInstance(new GuidManager()); }
public void OneTimeSetup() { guidManagerMock = new GuidManagerMock(); GuidManagerSingleton.SetInstance(guidManagerMock); }
private void OnDestroy() { GuidManagerSingleton.Remove(guidProviderAsset.GetGuid()); }