public static string GetPrefabOverrideModification(GameObject obj) { string modification = ""; GameObject childPrefabObj = UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(obj); PropertyModification[] modifications = UnityEditor.PrefabUtility.GetPropertyModifications(obj); modificationStrings.Clear(); for (int iModification = 0; iModification < modifications.Length; iModification++) { PropertyModification iterModification = modifications[iModification]; bool isOverrideModification; if (iterModification.target == childPrefabObj) { isOverrideModification = !Constants.PREFAB_ROOT_GAMEOBJECT_IGNORE_MODIFICATION_PROPERTY_PATHS.Contains(iterModification.propertyPath); } else if (iterModification.target == childPrefabObj.transform) { isOverrideModification = !Constants.PREFAB_ROOT_TRANSFORM_IGNORE_MODIFICATION_PROPERTY_PATHS.Contains(iterModification.propertyPath); } else if (iterModification.target == null) { isOverrideModification = false; } else if (childPrefabObj.GetComponent <SceneUnit>()) { isOverrideModification = IsPrefabOverrideModification(iterModification, childPrefabObj.GetComponent <SceneUnit>()); } else { isOverrideModification = true; } if (isOverrideModification) { modificationStrings.Add(Leyoutech.Utility.PrefabUtility.ConvertPrefabPropertyModificationToString(childPrefabObj, iterModification)); } } if (modificationStrings.Count > 0) { StringBuilder stringBuilder = StringUtility.AllocStringBuilderCache(); modificationStrings.Sort(); for (int iModification = 0; iModification < modificationStrings.Count; iModification++) { stringBuilder.Append(modificationStrings[iModification]); } modificationStrings.Clear(); modification = StringUtility.ReleaseStringBuilderCacheAndReturnString(); } else { modification = string.Empty; } return(modification); }
private IEnumerator Disperse_Co() { float totalWeight = 0; int[] unitCounts = new int[UnitTemplates.Length]; for (int iTemplate = 0; iTemplate < UnitTemplates.Length; iTemplate++) { totalWeight += UnitTemplates[iTemplate].Weight; unitCounts[iTemplate] = 0; } yield return(null); for (int iUnit = 0; iUnit < Count; iUnit++) { if (iUnit % INSTANTIATE_UNIT_COUNT_EVERFRAME == 0) { if (EditorUtility.DisplayCancelableProgressBar("Disperse" , string.Format("{0} / {1}", iUnit, Count) , iUnit / Count)) { break; } yield return(null); } float randomWeight = UnityEngine.Random.Range(0, totalWeight); int templateIndex = 0; for (int iTemplate = 0; iTemplate < UnitTemplates.Length; iTemplate++) { randomWeight -= UnitTemplates[iTemplate].Weight; if (randomWeight < 0) { templateIndex = iTemplate; break; } } UnitTemplate unitTemplate = UnitTemplates[templateIndex]; GameObject iterUnit = unitTemplate.IsPrefab ? UnityEditor.PrefabUtility.InstantiatePrefab(unitTemplate.Unit) as GameObject : Instantiate(unitTemplate.Unit); if (DisperseParent != null) { iterUnit.transform.SetParent(DisperseParent, false); } iterUnit.transform.localPosition = RandomUtility.RandomInSphere(Radius); iterUnit.transform.localEulerAngles = RandomUtility.RandomEulerAngles(); unitCounts[templateIndex]++; } StringBuilder stringBuilder = StringUtility.AllocStringBuilderCache(); for (int iTemplate = 0; iTemplate < unitCounts.Length; iTemplate++) { stringBuilder.Append("Generate Index: ").Append(iTemplate).Append(" Count: ").Append(unitCounts[iTemplate]).Append("\n"); } Debug.Log(StringUtility.ReleaseStringBuilderCacheAndReturnString()); yield return(null); EditorUtility.ClearProgressBar(); EndDisperse(); }
/// <summary> /// <see cref="m_PrefabOverrideModificationMd5"/> /// </summary> private void CaculatePrefabOverrideModification() { if (!UnityEditor.PrefabUtility.HasPrefabInstanceAnyOverrides(gameObject, false)) { m_PrefabOverrideModificationMd5 = string.Empty; } else { List <string> modificationStrings = null; if (m_OwnerMap != null) { modificationStrings = m_OwnerMap.GetStringsCache(); } else { modificationStrings = new List <string>(); } if (m_Prefab == null) { m_Prefab = UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(gameObject); } PropertyModification[] modifications = UnityEditor.PrefabUtility.GetPropertyModifications(gameObject); for (int iModification = 0; iModification < modifications.Length; iModification++) { PropertyModification iterModification = modifications[iModification]; bool isOverrideModification; if (iterModification.target == m_Prefab) { isOverrideModification = !Constants.PREFAB_ROOT_GAMEOBJECT_IGNORE_MODIFICATION_PROPERTY_PATHS.Contains(iterModification.propertyPath); } else if (iterModification.target == m_Prefab.transform) { isOverrideModification = !Constants.PREFAB_ROOT_TRANSFORM_IGNORE_MODIFICATION_PROPERTY_PATHS.Contains(iterModification.propertyPath); } else if (CheckChildOverride(iterModification)) { isOverrideModification = false; } else { isOverrideModification = IsPrefabOverrideModification(iterModification); } if (isOverrideModification) { Debug.Log("sceneunit:" + gameObject.name); modificationStrings.Add(Leyoutech.Utility.PrefabUtility.ConvertPrefabPropertyModificationToString(m_Prefab, iterModification)); } } if (modificationStrings.Count > 0) { StringBuilder stringBuilder = StringUtility.AllocStringBuilderCache(); modificationStrings.Sort(); for (int iModification = 0; iModification < modificationStrings.Count; iModification++) { stringBuilder.Append(modificationStrings[iModification]); } modificationStrings.Clear(); m_PrefabOverrideModificationMd5 = StringUtility.CalculateMD5Hash(StringUtility.ReleaseStringBuilderCacheAndReturnString()); } else { m_PrefabOverrideModificationMd5 = string.Empty; } } }