Динамические уровни кирпичного выключателя - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь создать игру для игры в кирпичи с динамической загрузкой уровней. Я хотел бы остаться в одной сцене на всю игру, а затем динамически загружать разные уровни, меняя позиции кирпича (например, один уровень, где кирпичи имеют форму круга, другой уровень, где кирпичи имеют форму квадрат и т. д.).

Я представлял экран как сетку, в которой каждая ячейка либо имеет кирпичик, либо нет, и размещал их, используя циклы for. Моя проблема заключается в динамической загрузке данных. Прямо сейчас у меня есть данные сетки в терминах массивов. Я наполовину пытался загрузить 1 файл JSON, но безуспешно.

Я не уверен, как решить эту проблему. Я делаю отдельные файлы JSON для каждого уровня? Могут ли файлы json иметь неровные массивы? Как бы я извлечь данные в виде массива? Есть ли способ сделать это с playerprefs?

Любая помощь будет оценена

public class BrickGrid : MonoBehaviour {
    string filename = "data.json";
    string jsonString;
    string path;

    public Transform brickPrefab;

    [System.Serializable]
    public class Bricks {
        public string[] rows;
    }

    void Start() {
        LoadGridData();
        InitGrid();
    }

    void LoadGridData() {
        path = Application.streamingAssetsPath + "/" + filename;

        if (File.Exists(path)) {
            jsonString = File.ReadAllText(path);
            BrickPattern rows = JsonUtility.FromJson<BrickPattern>(jsonString);
        }
    }

    void InitGrid() {
        int[] row1 = { 0, 0, 1, 1 };
        int[] row2 = { 1, 1, 0, 1 };
        int[] row3 = { 0, 0, 0, 1 };

        int[][] rows = new int[][] {row1, row2, row3};

        Vector2 brickPosition = new Vector3(-2.25f, 4f, 0);

        for (int i = 0; i < rows.Length; i++) {
            int[] individualRow = rows[i];
            for (int j = 0; j < individualRow.Length; j++){
                if (individualRow[j] == 1){
                    // instantiate
                    Instantiate(brickPrefab, brickPosition, Quaternion.identity);

                }
                else if (individualRow[j] == 0) {
                    continue;
                }

                // inrease x position
                brickPosition.x = brickPosition.x + 1.5f;
            }

            // increase y position and reset x position
            brickPosition.x = -2.25f;
            brickPosition.y = brickPosition.y - 1.5f;
        }
    }
}

1 Ответ

0 голосов
/ 05 июля 2018

да, вы можете создать префаб для каждого уровня, просто спроектируйте их под один GameObject и создайте префаб из этого GameObject. Теперь, когда вы измените уровень, создайте правильный префаб. Я думаю, что это будет самый простой способ.

Вы также можете попробовать много других способов. Жестко закодируйте места для каждого кирпича на каждом уровне и используйте эту информацию, когда вы «динамически» загружаете новый уровень. Сохраните значения положения в другом месте (файл, база данных и т. Д.).

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...