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); } }
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); } } }