СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

Проект Мироненко Ф.

Категория: Информатика

Нажмите, чтобы узнать подробности

Просмотр содержимого документа
«Мироненко Федор _школа Геула_ информатика»

Частное общеобразовательное учреждение средняя общеобразовательная школа «Геула»

Исследовательская работа по информатике

на тему: «Создание игры с применением игровой среды Unity и языка программирования c#»

Руководитель: Хаитбаева Е.Р.

Выполнил: ученик 10 класса

Мироненко Ф.А.

город Пятигорск 2021 г.

Содержание

Введение 3

Глава 1. История и синтаксис языка программирования C# 4

1.1 История возникновения Игровой среды Unity и языка программирования C# 4

1.2 Синтаксис языка программирования C# 5

Глава 2. Проектирование видеоигры в среде Unity 7

2.1 Сценарий игры 7

2.2 Создание игрового мира 7

2.3 Создание таймера круга 8

2.4 Экспериментальный запуск видеоигры 12

2.5 Оптимизация видеоигры 12

2.6 «Постройка игры» и ее запуск 14

Глава 3. Анкетирование 15

Заключение 17

Список использованной литературы 18

Интернет ресурсы 18

Приложение 1 19

Приложение 2 20

Приложение 3 21

Приложение 4 22

Приложение 5 23

Введение

Актуальность темы учебно-исследовательской работы

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

Предмет исследования: создание видеоигры с применением игрового движка unity и языка программирования C#

Предметные области: математика, информатика, физика, логика

Цель работы - разработать свою видеоигру

Задачи:

• познакомиться с литературой об игровой среде Unity и языка программирования c#;

• рассмотреть синтаксическое строение языка c#;

• рассмотреть функционал игровой среды Unity и создать игру;

• сделать выводы о проделанной работе;

Гипотеза

С помощью игровой среды Unity и языка программирования С#, я смогу сделать свою игру


Глава 1. История и синтаксис языка программирования C#

    1. История возникновения Игровой среды Unity и языка программирования C#

C# – объектно-ориентированный язык программирования. Это язык программирования, который был разработан в 1998 году группой инженеров компании Microsoft под руководством Андерса Хейлсберга и Скотта Вильтаумота как язык разработки приложений для платформы Microsoft .NET Framework0

C# относится к семье языков с C-подобным синтаксисом.

C# разрабатывался как язык программирования прикладного уровня для CLR1 и, зависит от ее возможностей. Присутствие или отсутствие «выразительных особенностей» языка диктуется тем, может ли конкретная языковая особенность быть транслирована в соответствующие конструкции CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C#. CLR предоставляет C#, как и всем другим .NET-ориентированным языкам, многие возможности, которых лишены «классические» языки программирования. Например, сборка мусора2 реализована не в самом C#, а в CLR для программ, написанных на C#. Язык программирования C# обновляется и в наше время. Последняя версия языка вышла 10 ноября 2020 года.

Первая версия Unity появилась в 2005 году, когда игровой движок был анонсирован на WDC. Изначально Unity предназначался исключительно только для компьютеров Mac, но уже в августе вышло обновление, позволяющее работать и под Windows. В следующих версиях постепенно добавлялись новые платформы.

В Unity есть возможность создавать приложения, как для мобильных устройств (Android, IOS), так и для стационарных компьютеров под управлением Windows, Linux или MacOS.

Игровая среда Unity поддерживает системы коллизий, генерацию mip-map текстур, normal-map, карт теней, а также систему LOD.

    1. Синтаксис языка программирования C#

Идентификатор – имя сущности. Идентификатор может только начинаться с символа {_}

Ключевые слова - это предварительно определенные зарезервированные идентификаторы, имеющие особое синтаксическое значение. Язык программирования C# имеет два типа ключевых слов — зарезервированные в любой части кода и контекстные. Ключевые слова, которые потребуются при создании игры:

  • Namespace – ключевое слово указывает название области выполнения скрипта для видеоигры

  • Static – ключевое слово используется для объявления статического члена, принадлежащего собственно типу, а не конкретному объекту, также static можно использовать для объявления классов static

  • Void – метод возврата, который не возвращает значение

  • Private – ключевое слово является модификатором доступа к переменным. Private является уровнем доступа с минимальными правами. Доступ к закрытым переменным можно получить только внутри тела класса или структуры, в которой они объявлены

  • String – класс, который предоставляет множество методов для безопасного создания, обработки и сравнения строк

  • Float – тип данных, представляющее действительное число с плавающей запятой в диапазоне от ±1,5 x 10−45 до ±3,4 x 1038

  • Int – тип данных, представляющее 32-разрядное целое число со знаком в диапазоне от -2 147 483 648 до 2 147 483 647

  • Using – ключевое слово позволяет обращаться скрипту к другим скриптам или библиотекам

  • Public – ключевое слово является модификатором доступа к переменным. Public является уровнем доступа с максимальными правами. Ограничений доступа к общим членам не существует

Ключевые слова в среде Unity

  • GameObject ­ тип объектов, которые могут существовать в Сцене

  • MonoBehaviour ­ базовый класс, от которого по умолчанию наследуется каждый скрипт Unity

  • Object – базовый класс для всех объектов, на которые Unity может ссылаться в редакторе

Глава 2. Проектирование видеоигры в среде Unity

Для достижения поставленной цели я спланировал следующие этапы:

  • сформулировать сценарий игры;

  • создать игровой мир;

  • создать таймер круга (с возможностью отображения лучшего круга);

  • провести эксперимент по запуску видеоигры;

  • провести анализ и выполнить корректировку методами оптимизации;

2.1 Сценарий игры

В основу игры заложен сюжет о начинающем пилоте, что начинает свою карьеру с картинга. В недалеком будущем он решает подписать контракт с гоночной командой. Но есть условие со стороны гоночной команды, предъявляемое каждому кандидату, ему необходимо поставить лучшее время на трассе Autodromo de Nationale Monza на Porche 911 GT-3R.

2.2 Создание игрового мира

Сначала необходимо загрузить данные из магазина Unity (Asset store). Это магазин, в котором можно скачать 3D модели, текстуры и скрипты. В первую очередь необходимы такие ассеты0 как Standard Assets, PBR Texture Lib и HQ Racing Car Model No.1202. Загружаем необходимые ассеты, и создаем проект в Unity.

Далее следует сделать очертания трека. Для этого модель дороги перенести из Assets-Track-Prefabs в 3D пространство. Передвигать объект в пространстве можно с помощью стрелок (X, Y, Z),поворачивать по 3 осям и увеличивать его размеры.

На следующем этапе создается объект «Terrain» для возможности расстановки деревьев. Для этого во вкладке «Hierarchy» создаём элемент «Terrain», для этого правой кнопкой мыши кликаем по области вкладки «Hierarchy» вызываем контекстное меню, затем “3D Object” и выбираем «Terrain». После выделяется элемент (1 клик ЛКМ по нему) и во вкладке «Inspector» отобразятся его настройки.

Далее нужно создать слой ландшафта, на котором будет трава. Для этого в меню «Inspector» переходим во вкладку «Paint Terrain», в выпадающем списке ищем «Paint Texture» и нажимаем левой кнопкой мыши по нему. Находим кнопку «Edit Terrain Layers…» и нажимаем по ней, затем нажимаем «Create Layer…», выбираем заранее загруженную текстуру травы и теперь на всем объекте Terrain находится трава.

Для посадки деревьев выделяется Terrain (1 клик ЛКМ по нему) и необходимо перейти во вкладку «Paint Trees». Нажать на кнопку «Edit Trees и Add Tree». Появляется окно «Add Tree», в пункт «Tree Prefab» необходимо перенести модель дерева. Для этого следует зайти в Assets-Standard Assets-Environment-SpeedTree-Broadleaf и перенести модель дерева под названием «Broadleaf_Desktop», и нажимаем «Add». Теперь данное дерево можно сажать на данном «Terrain» нажатием левой кнопки мыши, а стирать можно зажатием кнопки Shift и нажатием левой кнопки мыши. В результате вышеописанных действий, я получил следующее: (приложение 1, рисунок 1).

2.3 Создание таймера круга

Для создания таймера круга с применением языка программирования C# нужно создать папку UI и в ней нажатием правой кнопки мыши во всплывающем меню перейти по пути Create-C# Script, создать скрипт0 и называть его LapTimeManager. Unity автоматически в файле сделает необходимую заготовку, после чего можно открывать и редактировать файл. Пишем в файле следующее:

using System.Collections;

using System.Collections.Generic;

using UnityEngine; //Прописываем для доступа скрипта к библиотекам

using UnityEngine.UI; //Прописываем для доступа скрипта к библиотекам


public class LapTimeManager : MonoBehaviour

{

//Создаем переменные

public static int MinuteCount; //Счет минут

public static int SecondCount; //Счет секунд

public static float MilliCount; //Счет миллисекунд

public static string MilliDisplay; //Отображение миллисекунд



public GameObject MinuteBox; //Отображение минут

public GameObject SecondBox; //Отображение секунд

public GameObject MilliBox; //Отображение миллисекунд


// Update is called once per frame

void Update()

{

MilliCount += Time.deltaTime * 1000; //Начинается отсчет времени

MilliDisplay = MilliCount.ToString("F0");

MilliBox.GetComponent().text = "" + MilliDisplay;//Доступ к элементу Text в Unity


if (MilliCount =1000) //если значение миллисекунды больше или равно 1000

{

MilliCount = 0; //Обнуление миллисекунд

SecondCount += 1; //Прибавление значения в секунду на 1 единицу

}


if (SecondCount

{

SecondBox.GetComponent().text = "0" + SecondCount + ".";//Обнуление

}

else //Иначе

{

SecondBox.GetComponent().text = "" + SecondCount + ".";//Ничего не добавляется

}

if (SecondCount =60) //Если Значение секунд больше или равно 60

{

SecondCount = 0; //Значение секунд обнуляется

MinuteCount += 1; // Прибавление значения в минуту на 1 единицу

}


if(MinuteCount

{

MinuteBox.GetComponent().text = "0" + MinuteCount + ":";//Обнуление

}

Else //Иначе

{

MinuteBox.GetComponent().text = "" + MinuteCount + ":";//Ничего не добавляется

}


}

}

Далее необходимо создать скрипт и триггер0 для системы лучшего круга. Нажатием правой кнопки мыши во всплывающем меню переходим по пути Create-C# Script, создаем скрипт и называем его «LapComplete». В этом скрипте необходимо написать следующее:

using System.Collections;

using System.Collections.Generic;

using UnityEngine; //Прописываем для доступа скрипта к библиотекам

using UnityEngine.UI; //Прописываем для доступа скрипта к библиотекам


public class LapComplete : MonoBehaviour

{

//Создаем переменные

public GameObject LapCompleteTrig; //триггер «полного пути»

public GameObject HalfLapTrig; //триггер «половины пути»


public GameObject MinuteDisplay; //отображение минут

public GameObject SecondDisplay; //отображение секунд

public GameObject MilliDisplay; //отображение миллисекунд


void OnTriggerEnter() //Когда игрок вошел в триггер

{

if (LapTimeManager.SecondCount

{

SecondDisplay.GetComponent().text = "0" + LapTimeManager.SecondCount + ".";//Обнуление

}

else //Иначе

{

SecondDisplay.GetComponent().text = "" + LapTimeManager.SecondCount + ".";".";//Ничего не добавляется

}



if (LapTimeManager.MinuteCount

{

MinuteDisplay.GetComponent().text = "0" + LapTimeManager.MinuteCount + "."; //Обнуление

}

else //Иначе

{

MinuteDisplay.GetComponent().text = "" + LapTimeManager.MinuteCount + "."; ////Ничего не добавляется

}


MilliDisplay.GetComponent().text = "" + LapTimeManager.MilliCount; //Перенос значения миллисекунд из скрипта LapTimeManager


LapTimeManager.MinuteCount = 0; //Обнуление минут

LapTimeManager.SecondCount = 0; //Обнуление секунд

LapTimeManager.MilliCount = 0; //Обнуление миллисекунд


HalfLapTrig.SetActive(true); //Активация триггера «Половина пути»

LapCompleteTrig.SetActive(false); //Деактивация триггера «Полный путь»

}

}

Так как появился триггер, необходимо написать скрипт и для него. По своей сути он будет переключателем триггеров «половина пути» и «полный путь». Нажатием правой кнопки мыши во всплывающем меню переходим по пути Create-C# Script, создаем скрипт и называем его HalfPointTrigger. В этом скрипте необходимо написать следующее:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class HalfPointTrigger : MonoBehaviour

{

//Создаем переменные

public GameObject LapCompleteTrig;

public GameObject HalfLapTrig;


void OnTriggerEnter() //Когда игрок вошел в триггер

{

LapCompleteTrig.SetActive(true); //Активация триггера «Полный путь»

HalfLapTrig.SetActive(false); /Деактивация триггера «Половина пути»

}

}

Создам «Create Empty», для этого нужно нажать ПКМ по области «Hierarchy», вызвать контекстное меню и выбрать «Create Empty». Нужно выделить элемент (1 клик ЛКМ по нему) и перенести скрипт «LapTimeManager» в Inspector. Затем необходимо создать «Canvas» (для этого нужно правой кнопкой мыши кликнуть по области вкладки «Hierarchy», затем «UI» и выбирать «Canvas») и внутри него Panel (для этого необходимо правой кнопкой мыши кликнуть по области вкладки «Hierarchy», затем «UI» и нажать кнопкой левой кнопки мыши по «Panel»). Создам 3 объекта Text (для этого нужно правой кнопкой мыши кликнуть по области вкладки «Hierarchy», затем «UI» и выбрать «Text») и переименовываю эти объекты в минуты, секунды и миллисекунды, и переношу соответствующие объекты в графы («Minute Box», «Second Box», «Milli Box»).

Затем создам скрипт «LapCompleteTrigger». На стартовой прямой требуется создать Cube (для этого нужно правой кнопкой мыши кликнуть по области вкладки «Hierarchy», затем «3D Object» и выбирать «Cube»), растянуть его поперек дороги. Далее в меню Inspector необходимо найти свойство объекта Box Collider и выставить флажок на пункте Is Trigger. Далее необходимо перенести скрипт «LapComplete» в «Inspector» нашего объекта и перенести соответствующие объекты в графы («LapCompleteTrig», «HalfLapTrig», «MinuteDisplay», «SecondDisplay», «MilliDisplay»). Создам триггер «половины пути», для этого требуется на половине трека создать «Cube», растянуть его поперек дороги. Далее в меню «Inspector» выставить флажок на пункте Is Trigger. Перенесу скрипт «HalfPointTrigger» в «Inspector» объекта и перенесу соответствующие объекты в графы («LapCompleteTrig», «HalfLapTrig»).

В результате написано целых 3 скрипта, которые выполняют функцию таймера времени (приложение 1, рисунок 2).

2.4 Экспериментальный запуск видеоигры

Теперь, когда основные элементы игры созданы, можно провести пробный запуск видеоигры. Для этого необходимо зайти в Build Settings (File-Build Settings) и нажать Build and Run, чтобы начать сборку игры и затем запустить ее (приложение 2, рисунок 3).

Когда процесс сборки видеоигры завершится, Unity автоматически откроет исполняемый файл и запустит игру для ее тестирования. В ходе тестирования видеоигры были обнаружены проблемы с производительностью игры, а именно с низкой частотой кадров, что подтвердила программа «MSI Afterburner» (приложение 2,рисунок 4). И я решил игру оптимизировать.

2.5 Оптимизация видеоигры

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

Оптимизация моделей с помощью Blender

В настоящее время 3D модели распространяются в очень высоком качестве геометрии. Они имеют огромное количество треугольников, что нагружает видеоадаптер. Но представьте, что вы находитесь в городе. Каждый объект в городе это компьютерная модель, а у них всех высокое качество геометрии пусть вы этого даже не сможете различить на расстоянии. При этом нагрузка на видеоадаптер не эффективна. Так зачем зря нагружать видеоадаптер, если вы не увидите разницы? Именно для этого придумали LOD систему. Эта система переключает модели при сближении игрока к модели, с более низко качественной к более качественной и наоборот. Это позволяет использовать ресурсы видео ускорителя более эффективно.

В целях оптимизации 3D модели в игре можно использовать программу для 3D моделирования Blender. Сначала необходимо открыть Blender и создать новый проект. Потребуется очистить его (нажатием правой кнопки мыши на слово collection-удалить иерархию) и импортируем модель (нажать файл-Импортировать и выбирать нужный формат). После завершения импорта в «коллекции сцены», требуется нажать на любой объект (левой кнопкой мыши) и перейти в пункт «Настройки модификаторов». Нужно добавить модификатор «упрощение» и уменьшить параметр «соотношение». Чем меньше, тем лучше, но при маленьком значении качество геометрии может быть настолько низким, что объект может даже пропасть. Далее нужно сохранить модель в папку проекта (Файл-Экспортировать-Fbx) (приложение 2, рисунок 3).

Затем нужно зайти в Unity, выделить элемент (1 клик ЛКМ по нему) и во вкладке «Inspector» нажать кнопку «Add Component» и ввести в поиск «LOD Group» и добавить. Появился параметр LOD Group (приложение 2, рисунок 4), затем нажать LOD 0 и переместить объект из «Hierarchy» в Add и добавить новую модель в старую в «Hierarchy» и переместиь в Lod 1.

Все готово, важная часть оптимизация игры пройдена. Но что если и после этого игра работает не стабильно? Есть еще способы оптимизации.

Static batching и оптимизация освещения

Static batching позволяет уменьшить количество вызовов отрисовки для геометрии любого размера при условии, что он использует один и тот же материал и не перемещается. Часто это более эффективно, чем динамическое пакетирование (оно не преобразует вершины на ЦП), но использует больше памяти.

Чтобы воспользоваться static batching, необходимо указать, что определенные объекты статичны и не перемещаются, не вращаются и не масштабируются в игре. Для этого необходимо отметить объект как статический с помощью флажка Static в Inspector (приложение 2, рисунок 5)

Впоследствии этого действия, появится флажок на «Contribute Global Illumination» и unity начнет запекать карту освещения для этого объекта. Но зачем же запекать освещение заранее? Самое быстрое освещение – это то, которое не рассчитывается. Без запечённого освещения, видеокарта рассчитывает освещение каждую секунду, что негативно сказывается на производительности. Поэтому использование карт освещения это еще одна часть оптимизации игры

Использование Mip-Map0 текстур

Обычно, в параметрах импорта Generate Mip Maps включён для текстур (приложение 3, рисунок 6). В этом случае сжатие текстур поможет ограничить количество текстурных данных, транспортируемых в GPU при визуализации. Mip-Map текстуры позволяют графическому ускорителю использовать для маленьких треугольников текстуры пониженного разрешения.

2.6 «Постройка игры» и ее запуск

Последний этап при разработке игры, это ее сборка и запуск. Для этого необходимо зайти в Build Settings (File-Build Settings)(приложение 4, рисунок 7), добавить нужные сцены кнопкой Add Open Scenes (Для того, чтобы добавить сцену, необходимо ее открыть и нажать левой кнопкой мыши по «Add Open Scenes») и нажать Build. После этого Unity начнет автоматически собирать проект в директорию, которую вы выбрали.

По истечении некоторого времени, создастся папка, а в ней другие папки и файл .exe. Именно этот файл и отвечает за запуск игры. Чтобы проверить работоспособность видеоигры необходимо запустить файл и попробовать найти ошибки в своей игре. Если же их нет, поздравляю с выходом первой видеоигры!

Глава 3. Анкетирование

Достигнув цели проектной работы, мне стало интересно выяснить мнение одноклассников по вопросу качества моей видеоигры, и я решил провести анкетирование.

Я сформулировал следующие вопросы

  1. Оцените визуальное исполнение игры по 5 бальной шкале

  2. Оцените игровые механики, возможности в игре по 5 бальной шкале

  3. Оцените техническое состояние игры (отсутствие «багов», ошибок) по 5 бальной шкале

  4. Оцените качество интерфейса игры по 5 бальной шкале

  5. Оцените качество работы игры на вашем компьютере по 5 бальной шкале (Высокая частота кадров)

  6. Оцените звуковое оформление игры по 5 бальной шкале

  7. Заинтересовались ли вы работой в информационной сфере

Ответы 1 да

2 нет

  1. Оцените информативность данного проекта по созданию компьютерной видеоигры по 5 бальной шкале

  2. Пробовали ли вы найти работу в сфере информационных технологий

Ответы 1 да

2 Нет

  1. Поставьте итоговую оценку данной видеоигре по 10 бальной шкале

В результате мной была составлена таблица и построена диаграмма (приложение 5, диаграмма 1).

Номер вопроса

1

2

3

4

5

6

7

8

9

10

Процентное соотношение

80%

40%

95%

80%

75%

90%

50%

65%

70%

65%

Результаты анкетирования показали:

  • ответы практически на все вопросы, кроме 2 и 5 составляют свыше 75% одноклассников, это означает, представленная проектная работа интересна и познавательна аудитории моих сверстников. Следовательно, актуальность проекта высокая.

  • ответ одноклассников на 2 – 40%, скорее всего такой показатель связан с недостатком возможностей в игре и отсутствием других игровых режимов.

  • показатель в 50% на 7 вопрос также означает, представленная работа вызвала интерес, но в то же время у одноклассников, скорее всего, отсутствует понимание профессий, связанных со сферой информационной индустрии.


Заключение

В результате исследования мной были детально изучены: теоретические основы языка программирования C#; основы создания видеоигрового мира; способы оптимизации видеоигры;

В ходе исследования я подтвердил гипотезу и пришел к следующим выводам:

  1. Чем сложнее и качественнее видеоигра, тем больше времени нужно потратить на ее разработку;

  2. Оптимизация видеоигры – неотъемлемая часть её разработки;

  3. Легче и быстрее разработать игру в игровой среде, чем с помощью одного языка программирования.

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

Список использованной литературы

Интернет ресурсы

  1. https://docs.unity3d.com/Manual/index.html

  2. http://unity3d.ru/distribution/index.php

  3. https://ru.wikipedia.org

  4. https://docs.microsoft.com/ru-ru/dotnet/csharp


Приложения

Приложение 1

Рисунок 1. Созданный игровой мир в моем проекте

Рисунок 2. Таймер круга и лучший круг


Приложение 2

Рисунок 3. Сборка и пробный запуск видеоигры

Рисунок 4. Низкая частота кадров


Приложение 3

Рисунок 5. Ухудшение качества геометрии в связи с уменьшением параметра «соотношение»

Рисунок 6. LOD Group


Приложение 4

Рисунок 7. Включение флажка Static и Contribute Global Illumination

Рисунок 8. Включение флажка Generate Mip Maps


Приложение 5

Рисунок 9. Окно «Build Settings»

Диаграмма 1. Результаты анкетирования

01CLR - исполняющая среда, в которой компилируются программы, написанные на Microsoft .NET Framework

2Сборка мусора - Форма управления памятью

01 Ассет - цифровой объект, который представляет часть игрового контента. К ассетам относятся все данные, используемые и обрабатываемые компьютерной игрой: геометрические модели, текстуры, отдельные звуки и т.д.

0 Скрипт – язык кратких описаний действий, выполняемых системой.

0 Триггер – механизм, проверяющий присутствие каких-либо объектов игрового мира в заданном пространстве или расстояние от этих объектов до специальной точки.

0 Mip-Map текстуры – метод текстурирования, использующий несколько копий одной текстуры с разной детализацией.