Страницы

четверг, 12 декабря 2019 г.

Процедурное создание уровней в Unity. Часть 2. Создание окружения из текстового файла

Создадим файл, который включает в себя всю информацию о лабиринте.

Использование массивов – неплохой способ создать лабиринт; однако, может быть удобнее использовать определенный файл для каждого уровня. Вот что мы получим:
(1) возможность изменить структуру уровня без необходимости изменять код.
(2) Возможность создавать (и загружать) отдельные файлы для каждого уровня.
Таким образом, вы можете создать текстовый файл для каждого уровня, а затем загрузить его соответствующим образом.

Для этой цели мы будем использовать новый метод, называемый Resources.Load. Этот метод позволяет загружать ресурсы (например, текстуры или текст) из вашего проекта Unity. Итак, сначала мы создадим такой текстовый файл, а затем получим доступ к нему через наш скрипт. Пожалуйста, создайте новую папку под названием Resources в папке Assets (в окне проекта выберите Create | Folder).

Рис. 6. Создание папки

Создайте новый текстовый файл в любом редакторе на ваш выбор. Добавьте в него следующее содержимое:
1111111111
1010000001
1010101001
1010000001
1011110001
1000000001
1010101111
1001000001
1010000001
1111111111
Сохраните этот файл под именем maze.txt в папке Resources.

Рис. 7. Сохраняем текстовый файл в ресурсах

Если вы не знаете, где находится папка Resources (да и вообще любая попка проекта), кликните на нее правой кнопкой мыши и выберите из всплывающего меню пункт Show in Explorer. Вы также можете сохранить этот файл в другом месте, а затем перетащить в Resources.
Сейчас нам нужно изменить наш скрипт, что бы программа считывала данные из файла, а не из массива. Откройте GenerateMaze и удалите или закомментируйте содержимое метода Start.

Чтобы быстро закомментировать блок кода в Visual Studio Code, выделите нужный блок и нажмите Shift+Alt+A. Если хотите закомментировать строку, то встаньте на нее и нажмите Ctrl+/.

Добавьте в Start следующий код:
TextAsset t1 = (TextAsset)Resources.Load("maze", typeof(TextAsset));
        string s = t1.text;
        int i;
        s = s.Replace("\n", "");
        s = s.Replace("\r", "");
        for (i = 0; i < s.Length; i++)
        {
            if(s[i] == '1')
            {
                int column, row;
                column = i % 10;
                row = i / 10;
                GameObject t;
                t = (GameObject)(Instantiate(wall, new Vector3(50 - row * 10, 1.5f, 50 -  column * 10), Quaternion.identity));
            }
        }

  • Мы объявили переменную типа TextAsset, которую будем использовать для хранения содержимого текстового файла, созданного как ресурс. 
  • Содержание ассета теперь нам доступно через свойство text, загружаем его в строковую переменную.
  • Заменяем все символы конца строки (\n) на пустые строки с помощью функции Replace. Они были нам нужны в исходном файле для удобства и чтобы не ошибиться с формированием лабиринта, но теперь мы от них избавляемся. Если все-таки не получается лабиринт, то убираем еще и символы перевода каретки (\r).
  • В цикле проходим все символы нашей строки, и если символ равен ‘1’, то определяем столбец и строку. Номер столбца будет равен остатку от целочисленного деления на 10, а номер строки – результату целочисленного деления на 10.
  • Создаем экземпляр объекта wall из префаба с нужными координатами (как в предыдущем примере, где мы создавали лабиринт из массива).

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

Содержание

Часть 1. Создание уровня из массива

Часть 3. Создание окружения из файла рисунка