public static bool FillHierarchyReferenceEntries(Object[] objects, ProcessObjectReferenceHandler processReferenceCallback) { EntryFinder.currentProcessReferenceCallback = processReferenceCallback; #if !UNITY_2020_1_OR_NEWER updateStep = -1; #endif var prefabStage = PrefabStageUtility.GetCurrentPrefabStage(); if (prefabStage != null) { return(ProcessPrefabForSceneScopeReferences(prefabStage)); } var scenes = GetScenesFromObjects(objects); var rootObjects = GetRootGameObjectsFromScenes(scenes); return(ProcessSceneForSceneScopeReferences(rootObjects)); }
public static bool FillProjectScopeReferenceEntries(List <AssetConjunctions> conjunctionInfoList, ProcessObjectReferenceHandler processReferenceCallback) { var canceled = false; EntryFinder.currentProcessReferenceCallback = processReferenceCallback; var count = conjunctionInfoList.Count; #if !UNITY_2020_1_OR_NEWER var updateStep = Math.Max(count / ProjectSettings.UpdateProgressStep, 1); #endif for (var i = 0; i < count; i++) { if ( #if !UNITY_2020_1_OR_NEWER (i < 10 || i % updateStep == 0) && #endif EditorUtility.DisplayCancelableProgressBar( string.Format(ReferencesFinder.ProgressCaption, 2, ReferencesFinder.PhasesCount), string.Format(ReferencesFinder.ProgressText, "Filling reference details", i + 1, count), (float)i / count)) { canceled = true; break; } var assetConjunctions = conjunctionInfoList[i]; ProjectScopeReferencesFinder.currentAssetConjunctions = assetConjunctions; ProcessProjectScopeTargets(assetConjunctions); SetReferencingEntries(assetConjunctions.conjunctions); } return(canceled); }
public static void ProcessObject(Location currentLocation, Object inspectedUnityObject, Object target, EntryAddSettings addSettings, ProcessObjectReferenceHandler processReferenceCallback) { var onlyVisibleProperties = currentLocation != Location.ScriptAsset; var componentTraverseInfo = new SerializedObjectTraverseInfo(target, onlyVisibleProperties); string lastScriptPropertyName = null; CSTraverseTools.TraverseObjectProperties(componentTraverseInfo, (info, sp) => { if (currentLocation == Location.ScriptAsset) { if (sp.isArray) { if (sp.type == "string") { if (sp.propertyPath.IndexOf("m_DefaultReferences.Array.data[", StringComparison.OrdinalIgnoreCase) == 0) { if (sp.stringValue != null) { lastScriptPropertyName = sp.stringValue; // skipping first pair item of the m_DefaultReferences array item sp.Next(false); } } } } } if (sp.propertyType == SerializedPropertyType.ObjectReference && sp.objectReferenceValue != null) { string propertyName; if (lastScriptPropertyName != null) { propertyName = lastScriptPropertyName; lastScriptPropertyName = string.Empty; } else { propertyName = sp.propertyPath; } /*if (string.Equals(propertyName, "m_Script", StringComparison.OrdinalIgnoreCase)) * { * propertyName = "Script source"; * }*/ addSettings.propertyPath = propertyName; processReferenceCallback(inspectedUnityObject, sp.objectReferenceInstanceIDValue, addSettings); /* material instance handling */ var material = sp.objectReferenceValue as Material; if (material == null) { return; } if (currentLocation == Location.PrefabAssetGameObject) { if (AssetDatabase.GetAssetPath(material) != AssetDatabase.GetAssetPath(target)) { return; } if (AssetDatabase.IsSubAsset(material)) { return; } } else { if (AssetDatabase.Contains(material)) { return; } } addSettings.prefix = "[Material Instance]"; addSettings.suffix = "(Main Texture)"; var mainTextureInstanceId = 0; if (material.HasProperty(MainTextureShaderProperty)) { var mainTexture = material.mainTexture; mainTextureInstanceId = mainTexture != null ? mainTexture.GetInstanceID() : 0; } processReferenceCallback(inspectedUnityObject, mainTextureInstanceId, addSettings); addSettings.suffix = "(Shader)"; var shaderInstanceId = material.shader != null ? material.shader.GetInstanceID() : 0; processReferenceCallback(inspectedUnityObject, shaderInstanceId, addSettings); var materialSo = new SerializedObject(material); var texEnvs = materialSo.FindProperty("m_SavedProperties.m_TexEnvs.Array"); if (texEnvs != null) { for (var k = 0; k < texEnvs.arraySize; k++) { var arrayItem = texEnvs.GetArrayElementAtIndex(k); var fieldName = arrayItem.displayName; if (fieldName == MainTexturePropertyName) { continue; } var textureProperty = arrayItem.FindPropertyRelative("second.m_Texture"); if (textureProperty != null) { if (textureProperty.propertyType == SerializedPropertyType.ObjectReference) { addSettings.suffix = " (" + fieldName + ")"; processReferenceCallback(inspectedUnityObject, textureProperty.objectReferenceInstanceIDValue, addSettings); } } else { Debug.LogError(Maintainer.ConstructError("Can't get second.m_Texture from texEnvs at " + inspectedUnityObject.name)); } } } else { Debug.LogError(Maintainer.ConstructError("Can't get m_SavedProperties.m_TexEnvs.Array from material instance at " + inspectedUnityObject.name)); } } lastScriptPropertyName = null; }); }
public static void ProcessTilemap(Object inspectedUnityObject, Tilemap target, EntryAddSettings addSettings, ProcessObjectReferenceHandler processReferenceCallback) { var tilesCount = target.GetUsedTilesCount(); if (tilesCount == 0) { return; } var usedTiles = new TileBase[tilesCount]; target.GetUsedTilesNonAlloc(usedTiles); foreach (var usedTile in usedTiles) { processReferenceCallback(inspectedUnityObject, usedTile.GetInstanceID(), addSettings); var tile = usedTile as Tile; if (tile == null) { continue; } if (tile.sprite != null) { processReferenceCallback(inspectedUnityObject, tile.sprite.GetInstanceID(), addSettings); } } }