public void RefreshData() { List <SkillConfigContainer> skillPrefabs = PrefabLoader.LoadAllPrefabsOfType <SkillConfigContainer>("Assets/Resources/Prefabs/Skills", SearchOption.AllDirectories); SkillConfigContainers = skillPrefabs; List <SkillConfigContainer> startSkillPrefabs = PrefabLoader.LoadAllPrefabsOfType <SkillConfigContainer>("Assets/Resources/Prefabs/Skills/StartSkills"); StartSkillConfigContainers = startSkillPrefabs; }
void Awake() { cam = Camera.main.GetComponent <EditorCamera>(); // load in all the data for all the levels DirectoryInfo dirInfo = new DirectoryInfo(Application.streamingAssetsPath + "\\Levels\\"); FileInfo[] fileInfos = dirInfo.GetFiles("*.dat"); BinaryFormatter bf = new BinaryFormatter(); Dictionary <string, LevelData> levelDatas = new Dictionary <string, LevelData>(); List <string> prefabIndexes = new List <string>(); List <int[]> prefabTop3 = new List <int[]>(); for (int i = 0; i < fileInfos.Length; i++) { FileStream file = fileInfos[i].Open(FileMode.Open); LevelData ld = (LevelData)bf.Deserialize(file); levelDatas.Add(ld.name, ld); file.Close(); // go through prefabs of every level to assign integers instead of string names, for efficient searching // instantiate empty top 3 array for later foreach (PrefabData pd in ld.prefabDatas) { if (!prefabIndexes.Contains(pd.name)) { prefabIndexes.Add(pd.name); prefabTop3.Add(new int[] { 0, 0, 0 }); } pd.index = prefabIndexes.IndexOf(pd.name); } } /****** * Dictionary<string, LevelData> levelDatas can now used here for seed generation * String names may be useful for generator but makes it less efficient to search through later * This will eventually be changed into simple LevelData array levels *******/ levels = new LevelData[levelDatas.Count]; int index = 0; foreach (KeyValuePair <string, LevelData> ld in levelDatas) { levels[index] = ld.Value; index++; } prevIndexes = new int[5] { -1, -1, -1, -1, -1 }; level1Index = GetNextLevel(); level2Index = GetNextLevel(); level3Index = GetNextLevel(); // go through every level to see how many of each prefab we need // only three levels will ever be active at one time so get top 3 amounts of each prefab foreach (LevelData ld in levels) { int[] prefabCount = new int[prefabIndexes.Count]; for (int i = 0; i < prefabCount.Length; i++) { prefabCount[i] = 0; } foreach (PrefabData pd in ld.prefabDatas) { prefabCount[pd.index]++; } for (int i = 0; i < prefabCount.Length; i++) { int first = prefabTop3[i][0]; int second = prefabTop3[i][1]; int third = prefabTop3[i][2]; int smallest = Mathf.Min(first, Mathf.Min(second, third)); if (prefabCount[i] > smallest) { if (smallest == first) { prefabTop3[i][0] = prefabCount[i]; } else if (smallest == second) { prefabTop3[i][1] = prefabCount[i]; } else { prefabTop3[i][2] = prefabCount[i]; } } } } // instantiate all prefabs at corresponding index levelPieces = new LevelPiece[prefabIndexes.Count][]; Dictionary <string, GameObject> prefabs = PrefabLoader.LoadAllPrefabsOfType <MonoBehaviour>("Assets/Resources/LevelPieces"); for (int i = 0; i < prefabIndexes.Count; i++) { levelPieces[i] = new LevelPiece[prefabTop3[i][0] + prefabTop3[i][1] + prefabTop3[i][2]]; for (int j = 0; j < levelPieces[i].Length; j++) { levelPieces[i][j] = new LevelPiece(); levelPieces[i][j].prefab = Instantiate(prefabs[prefabIndexes[i]]); levelPieces[i][j].prefab.SetActive(false); // when instantiated every name has (1), (2), etc so remove that levelPieces[i][j].prefab.name = levelPieces[i][j].prefab.name.Split('(')[0]; // get references to transform and script so we don't have to get them each time levelPieces[i][j].transform = levelPieces[i][j].prefab.transform; levelPieces[i][j].script = levelPieces[i][j].prefab.GetComponent <LevelPieceScript>(); levelPieces[i][j].parent = -1; } } LevelData level1 = levels[level1Index]; LevelData level2 = levels[level2Index]; LevelData level3 = levels[level3Index]; for (int i = 0; i < level1.prefabDatas.Length; i++) { PrefabData pd = level1.prefabDatas[i]; PlaceLevelPiece(level1Index, pd.index, 0, 0, pd.positionX, pd.positionY, pd.positionZ, pd.rotationX, pd.rotationY, pd.rotationZ, pd.scaleX, pd.scaleY, pd.scaleZ, pd.extraValues); } for (int i = 0; i < level2.prefabDatas.Length; i++) { PrefabData pd = level2.prefabDatas[i]; PlaceLevelPiece(level2Index, pd.index, level1.endpointX, level1.endpointY, pd.positionX, pd.positionY, pd.positionZ, pd.rotationX, pd.rotationY, pd.rotationZ, pd.scaleX, pd.scaleY, pd.scaleZ, pd.extraValues); } for (int i = 0; i < level3.prefabDatas.Length; i++) { PrefabData pd = level3.prefabDatas[i]; PlaceLevelPiece(level3Index, pd.index, level1.endpointX + level2.endpointX, level2.endpointY, pd.positionX, pd.positionY, pd.positionZ, pd.rotationX, pd.rotationY, pd.rotationZ, pd.scaleX, pd.scaleY, pd.scaleZ, pd.extraValues); } }
void OnGUI() { if (GUILayout.Button("Save Level")) { GameObject obj = (GameObject)EditorUtility.InstanceIDToObject(Selection.activeObject.GetInstanceID()); LevelData ld = new LevelData(); ld.name = obj.name; ld.prefabDatas = new PrefabData[obj.transform.childCount]; Dictionary <string, int> prefabIndexes = GetPrefabIndexes(); int count = 0; bool hasEndpoint = false; foreach (Transform c in obj.transform) { c.name = c.name.Split(' ')[0]; ld.prefabDatas[count] = new PrefabData(); ld.prefabDatas[count].name = c.name; ld.prefabDatas[count].index = prefabIndexes[c.name]; ld.prefabDatas[count].positionX = c.localPosition.x; ld.prefabDatas[count].positionY = c.localPosition.y; ld.prefabDatas[count].positionZ = c.localPosition.z; ld.prefabDatas[count].rotationX = c.localEulerAngles.x; ld.prefabDatas[count].rotationY = c.localEulerAngles.y; ld.prefabDatas[count].rotationZ = c.localEulerAngles.z; ld.prefabDatas[count].scaleX = c.localScale.x; ld.prefabDatas[count].scaleY = c.localScale.y; ld.prefabDatas[count].scaleZ = c.localScale.z; LevelPieceScript script = c.GetComponent <LevelPieceScript>(); if (script != null) { ld.prefabDatas[count].extraValues = script.GetExtraValues(); } if (c.name == "Endpoint") { hasEndpoint = true; ld.endpointX = c.localPosition.x; ld.endpointY = c.localPosition.y; } count++; } if (!File.Exists(basePath + obj.name + ".dat") || EditorUtility.DisplayDialog("File already exists", "Do you want to overwrite?", "Yes", "No")) { if (!hasEndpoint) { EditorUtility.DisplayDialog("Error", "This level has no endpoint", "OK"); } else { XmlSerializer serializer = new XmlSerializer(typeof(LevelData)); StreamWriter writer = new StreamWriter(basePath + "xml\\" + obj.name + ".xml"); serializer.Serialize(writer.BaseStream, ld); writer.Close(); BinaryFormatter bf = new BinaryFormatter(); FileStream stream = File.Create(basePath + obj.name + ".dat"); bf.Serialize(stream, ld); stream.Close(); } } } if (GUILayout.Button("Load Level")) { string path = EditorUtility.OpenFilePanel("Choose level", "Assets\\StreamingAssets\\Levels", "dat"); if (path.Length != 0) { BinaryFormatter bf = new BinaryFormatter(); FileStream file = File.Open(path, FileMode.Open); LevelData ld = (LevelData)bf.Deserialize(file); file.Close(); GameObject level = new GameObject(ld.name); Dictionary <string, GameObject> prefabs = PrefabLoader.LoadAllPrefabsOfType <MonoBehaviour>("Assets/Resources/LevelPieces"); for (int i = 0; i < ld.prefabDatas.Length; i++) { PrefabData pd = ld.prefabDatas[i]; GameObject prefab = (GameObject)PrefabUtility.InstantiatePrefab(prefabs[pd.name]); prefab.transform.parent = level.transform; prefab.transform.Translate(pd.positionX, pd.positionY, pd.positionZ); prefab.transform.Rotate(pd.rotationX, pd.rotationY, pd.rotationZ); prefab.transform.localScale = new Vector3(pd.scaleX, pd.scaleY, pd.scaleZ); if (pd.extraValues != null) { LevelPieceScript script = prefab.GetComponent <LevelPieceScript>(); script.SetExtraValues(pd.extraValues); } } } } }
void Awake() { cam = Camera.main.GetComponent <EditorCamera>(); // load in all the data for all the levels DirectoryInfo dirInfo = new DirectoryInfo(Application.streamingAssetsPath + "\\Levels\\"); FileInfo[] fileInfos = dirInfo.GetFiles("*.dat"); BinaryFormatter bf = new BinaryFormatter(); levelDatas = new Dictionary <string, LevelData>(); List <string> prefabIndexes = new List <string>(); for (int i = 0; i < fileInfos.Length; i++) { FileStream file = fileInfos[i].Open(FileMode.Open); LevelData ld = (LevelData)bf.Deserialize(file); levelDatas.Add(ld.name, ld); file.Close(); // go through prefabs of every level to assign integers instead of string names, for efficient searching foreach (PrefabData pd in ld.prefabDatas) { if (!prefabIndexes.Contains(pd.name)) { prefabIndexes.Add(pd.name); } pd.index = prefabIndexes.IndexOf(pd.name); } } currLevel = levelDatas[levelName]; // go through each level to count how many prefabs of each type int[] prefabCount = new int[prefabIndexes.Count]; for (int i = 0; i < prefabCount.Length; i++) { prefabCount[i] = 0; } foreach (KeyValuePair <string, LevelData> ld in levelDatas) { foreach (PrefabData pd in levelDatas[ld.Key].prefabDatas) { prefabCount[pd.index]++; } } // instantiate all prefabs at corresponding index levelPieces = new LevelPiece[prefabIndexes.Count][]; Dictionary <string, GameObject> prefabs = PrefabLoader.LoadAllPrefabsOfType <MonoBehaviour>("Assets/Resources/LevelPieces"); for (int i = 0; i < prefabIndexes.Count; i++) { levelPieces[i] = new LevelPiece[prefabCount[i] * 3]; for (int j = 0; j < levelPieces[i].Length; j++) { levelPieces[i][j] = new LevelPiece(); levelPieces[i][j].prefab = Instantiate(prefabs[prefabIndexes[i]]); levelPieces[i][j].prefab.SetActive(false); // when instantiated every name has (1), (2), etc so remove that levelPieces[i][j].prefab.name = levelPieces[i][j].prefab.name.Split('(')[0]; // get references to transform and script so we don't have to get them each time levelPieces[i][j].transform = levelPieces[i][j].prefab.transform; levelPieces[i][j].script = levelPieces[i][j].prefab.GetComponent <LevelPieceScript>(); levelPieces[i][j].parent = 0; } } // place 3 levels for (int i = 0; i < currLevel.prefabDatas.Length; i++) { PrefabData pd = currLevel.prefabDatas[i]; PlaceLevelPiece(1, pd.index, 0, 0, pd.positionX, pd.positionY, pd.positionZ, pd.rotationX, pd.rotationY, pd.rotationZ, pd.scaleX, pd.scaleY, pd.scaleZ, pd.extraValues); PlaceLevelPiece(2, pd.index, currLevel.endpointX, currLevel.endpointY, pd.positionX, pd.positionY, pd.positionZ, pd.rotationX, pd.rotationY, pd.rotationZ, pd.scaleX, pd.scaleY, pd.scaleZ, pd.extraValues); PlaceLevelPiece(3, pd.index, currLevel.endpointX * 2, currLevel.endpointY, pd.positionX, pd.positionY, pd.positionZ, pd.rotationX, pd.rotationY, pd.rotationZ, pd.scaleX, pd.scaleY, pd.scaleZ, pd.extraValues); } }