Example #1
0
    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;
    }
Example #2
0
    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);
        }
    }