Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        /// <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;
                }
            }
        }