예제 #1
0
        public static void RecursiveSaveObject(PrefabData PrefabData, string ID, IndividualObject individualObject,
                                               GameObject PrefabEquivalent, GameObject gameObject, ObjectMapData ObjectMapData,
                                               Vector3?CoordinateOverride = null, bool UseInstance = false)
        {
            individualObject.ID = ID;
            //Compare classes here
            FillOutClassData(PrefabData, individualObject, PrefabEquivalent, gameObject, ObjectMapData,
                             CoordinateOverride, UseInstance);


            if (PrefabEquivalent.transform.childCount != gameObject.transform.childCount)
            {
                // Logger.LogError("Mismatched children between Prefab " + PrefabEquivalent + " and game object " +
                // gameObject + " at " + gameObject.transform.localPosition +
                // "  Added children is not currently supported in This version of the map saver ");
            }

            for (int i = 0; i < PrefabEquivalent.transform.childCount; i++)
            {
                var newindividualObject = new IndividualObject();
                individualObject.Children.Add(newindividualObject);
                RecursiveSaveObject(PrefabData, ID + "," + i, newindividualObject,
                                    PrefabEquivalent.transform.GetChild(i).gameObject,
                                    gameObject.transform.GetChild(i).gameObject, ObjectMapData, UseInstance: UseInstance);
            }
        }
예제 #2
0
        public static void FillOutClassData(PrefabData PrefabData, IndividualObject individualObject,
                                            GameObject PrefabEquivalent, GameObject gameObject, ObjectMapData ObjectMapData,
                                            Vector3?CoordinateOverride = null, bool UseInstance = false)
        {
            Dictionary <string, int> ClassCount = new Dictionary <string, int>();
            var PrefabComponents     = PrefabEquivalent.GetComponents <MonoBehaviour>().ToList();
            var gameObjectComponents = gameObject.GetComponents <MonoBehaviour>().ToList();

            for (int i = 0; i < PrefabComponents.Count; i++)
            {
                var PrefabMono = PrefabComponents[i];
                if (ClassCount.ContainsKey(PrefabMono.GetType().Name) == false)
                {
                    ClassCount[PrefabMono.GetType().Name] = 0;
                }
                ClassCount[PrefabMono.GetType().Name]++;

                var objectContainer = gameObjectComponents[i] as ObjectContainer;
                if (objectContainer != null)
                {
                    foreach (var objectBehaviour in objectContainer.GetStoredObjects().Select(obj => obj.GetComponent <ObjectBehaviour>()))
                    {
                        if (CoordinateOverride == null)
                        {
                            ProcessIndividualObject(objectBehaviour.gameObject, ObjectMapData,
                                                    gameObject.transform.localPosition, UseInstance);
                        }
                        else
                        {
                            ProcessIndividualObject(objectBehaviour.gameObject, ObjectMapData,
                                                    CoordinateOverride, UseInstance);
                        }
                    }
                }


                var itemStorage = gameObjectComponents[i] as ItemStorage;
                if (itemStorage != null)
                {
                    foreach (var objectBehaviour in itemStorage.GetItemSlots())
                    {
                        if (objectBehaviour.Item == null)
                        {
                            continue;
                        }
                        if (CoordinateOverride == null)
                        {
                            ProcessIndividualObject(objectBehaviour.Item.gameObject, ObjectMapData,
                                                    gameObject.transform.localPosition, UseInstance);
                        }
                        else
                        {
                            ProcessIndividualObject(objectBehaviour.Item.gameObject, ObjectMapData,
                                                    CoordinateOverride, UseInstance);
                        }
                    }
                }


                var OutClass = new ClassData();
                OutClass.ClassID = PrefabMono.GetType().Name + "@" + ClassCount[PrefabMono.GetType().Name];
                MonoToID[gameObjectComponents[i]] = PrefabData.ID + "@" + individualObject.ID + "@" + OutClass.ClassID;
                RecursiveSearchData(OutClass, "", PrefabMono, gameObjectComponents[i], UseInstance);

                if (OutClass.IsEmpty() == false)
                {
                    individualObject.ClassDatas.Add(OutClass);
                }
            }
        }