Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Документация для продвинутых пользователей
                Менеджер игровых ресурсов(Asset Manager)

Менеджер игровых ресурсов(Asset Manager)

Опубликованно: 06.02.2016, 20:57
Последняя редакция, Andry: 13.10.2017 23:33

Под игровыми ресурсами(assets)  мы подразумевает мультимедийные файлы, такие как 3D-модели, материалы, текстуры, сцены, пользовательские шейдеры, музыку и звуковые файлы и пользовательские шрифты. JME3 имеет встроенное менеджер ресурсов(asset manager), который поможет вам сохранять игровые ресурсы вашего проекта организованными. Думайте о менеджере ресурсов как о файловой системе вашей игры, независимой от фактической платформы развертывания. По умолчанию, ваши игровые ресурсы сохраняются в папке MyGame/assets/ вашего проекта.

Преимущества менеджера ресурсов (AssetManager):

  • Пути остаются теми же, независимо от того, работает ли игра на Windows, Mac, Linux, и.т.д.!
  • AssetManager автоматически кэширует и оптимизирует обработку объектов OpenGL. Например, одни и те же текстуры не загружаются на видеокарту несколько раз, когда одну текстуру использует несколько моделей.
  • Сценарий сборки по умолчанию автоматически связывает содержимое каталога ресурсов с исполняемый файл.

Опытные пользователи могут писать собственные скрипты сборки и упаковки, и могут регистрировать пользовательский путь к AssetManager, но это зависит уже от вас.

Контекст

jMonkeyProjects/MyGame/assets/    # Здесь вы храните игровые ресурсы в под папках!
jMonkeyProjects/MyGame/build/     # SDK генерирует сборку классов здесь(*)
jMonkeyProjects/MyGame/build.xml  # Настройка скрипта сборки Ant здесь
jMonkeyProjects/MyGame/nbproject/ # SDK сохраняет по умолчанию build.xml и метаданные (*)
jMonkeyProjects/MyGame/dist/      # SDK генерирует исполняемый дистрибутив здесь (*)
jMonkeyProjects/MyGame/src/       # Здесь хранятся ваши исходники Java
jMonkeyProjects/MyGame/test/      # Здесь вы размещаете тестовые классы (необязательно)
(*)Управляется jMonkeyEngine SDK - не редактировать!

Смотрите также: Рекомендации.

Применение

Объект assetManager является экземпляром com.jme3.asset.AssetManager, к которому может получить доступ каждый com.jme3.app.Application. Он поддерживает root, который также включает в себя пути к классу вашего проекта по умолчанию, поэтому вы можете загрузить любой игровой ресурс, находящийся в этом пути к классам, то есть на верхнем уровне вашего каталога проекта.

Вы можете использовать унаследованный объект assetManager непосредственно, или использовать аксессор app.getAssetManager().

Вот пример того как вы можете загрузить игровые ресурсы с использованием AssetManager. Эти строки загружают материал по умолчанию из встроенного каталога Common/:

Material mat = (Material) assetManager.loadAsset(
    new AssetKey("Common/Materials/RedColor.j3m"));

Этот Материал «находится где-то» в jME3 JAR; Менеджер ресурсов по умолчанию настроен правильно обрабатывать Common/… пути, так что вам не нужно указывать полный путь, когда речь идет о встроенных в игру в игровых ресурсов (например, по умолчанию материалов).

Кроме того, можно настроить менеджер ресурсов и добавить любой путь к своему root. Это означает, что вы можете загрузить игровые ресурсы из любой указанной вами папки проекта. В следующем примере показано, как вы можете загружать ресурсы из папок игровых ресурсов вашего проекта.

Каталог ресурсов

По умолчанию, jME3 ищет модели в каталогах с именем assets.

В Java проектах, созданных в jMonkeyEngine SDK, папка assets создается по умолчанию в папке проекта. При использовании любого другого IDE, или из командной строки, вы просто создаете папку assets вручную.

Это наша рекомендация о структуре каталогов для хранения ресурсов:

jMonkeyProjects/MyGame/src/...           # Пакеты, .java исходный код.
jMonkeyProjects/MyGame/assets/...        # Папка игровых ресурсов:
jMonkeyProjects/MyGame/assets/Interface/ # .font, .jpg, .png, .xml
jMonkeyProjects/MyGame/assets/MatDefs/   # .j3md
jMonkeyProjects/MyGame/assets/Materials/ # .j3m
jMonkeyProjects/MyGame/assets/Models/    # .j3o
jMonkeyProjects/MyGame/assets/Scenes/    # .j3o
jMonkeyProjects/MyGame/assets/Shaders/   # .j3f, .vert, .frag
jMonkeyProjects/MyGame/assets/Sounds/    # .ogg, .wav
jMonkeyProjects/MyGame/assets/Textures/  # .jpg, .png; also .mesh.xml+.material, .mtl+.obj, .blend (!)

Эти подкаталоги являются наиболее распространенными примерами.

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

Примеры: Вы можете переименовать assets/Sounds в assets/Audio, можно удалить assets/MatDefs если вы его не используете, вы можете создать assets/AIscripts, и.т.д. Вы можете переименовать/переместить папку assets/Textures или её подпапки, но тогда вы должны реэкспортировать все модели, и вновь переконвертировать их все в .j3o, так что планируйте все заранее!

Сохраняйте текстуры в assets/Textures/, прежде чем станете работать с ними в редакторе сетки! Экспортируйте и сохраняйте файлы 3D моделей (.mesh.xml+.material, .mtl+.obj, .blend) в assets/Textures/(!) перед преобразованием модели в двоичный формат (.j3o)! Это гарантирует, что пути  текстуры будут правильно указывать на ваши папки в assets/Textures.
После преобразования, вы перемещаете .j3o файл в папку assets/Models/ или assets/Scenes/. Таким образом, вы можете повторно использовать текстуры, ваши двоичные файлы последовательно связывают правильные текстуры, а папки assets/Models и assets/Scenes не становятся загроможденными.

Пример кода: загрузка ресурсов

Создадим экземпляр материала с описанием материала Unshaded.j3md:

Material mat_brick = new Material(
    assetManager, "Common/MatDefs/Misc/Unshaded.j3md");

Применим текстуры материала:

mat_brick.setTexture("ColorMap",
    assetManager.loadTexture("Textures/Terrain/BrickWall/BrickWall.jpg"));

Загрузим шрифты:

guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt");

Загрузим модели:

Spatial ninja = assetManager.loadModel("Models/Ninja/Ninja.mesh.xml");

Загрузка сцены из файла Ogre3D dotScene, который хранится внутри zip архива:

assetManager.registerLocator("town.zip", ZipLocator.class);
Spatial scene = assetManager.loadModel("main.scene");
rootNode.attachChild(scene);

В качестве альтернативы ZipLocator, существует также HttpZipLocator, который может транслировать модели из zop архива онлайн:

assetManager.registerLocator("https://storage.googleapis.com/"
    + "google-code-archive-downloads/v2/code.google.com/"
    + "jmonkeyengine/wildhouse.zip", HttpZipLocator.class);
Spatial scene = assetManager.loadModel("main.scene");
rootNode.attachChild(scene);

jME3 также предлагает ClasspathLocator, ZipLocator, FileLocator, HttpZipLocator, и UrlLocator (см. com.jme3.asset.plugins).

 В пользовательском сценарий сборки автоматически не включаются все файлы ZIP в исполняемый файл. Смотрите «Не удается найти ресурс» решение ниже.

Типичные задачи Asset Manager

Задача? Решение!
Загрузить модель с материалами Используйте метод менеджера ресурсов loadModel() и прикрепите spatial к rootNode

Spatial elephant = assetManager.loadModel("Models/Elephant/Elephant.mesh.xml");
rootNode.attachChild(elephant);
Spatial elephant = assetManager.loadModel("Models/Elephant/Elephant.j3o");
rootNode.attachChild(elephant);
Загрузить модель без материалов Если у вас модель без материалов, вы должны назначить ей материал по умолчанию, чтобы сделать ее видимой.

Spatial teapot = assetManager.loadModel("Models/Teapot/Teapot.j3o");
// материал по умолчанию
Material mat = new Material(assetManager, "Common/MatDefs/Misc/ShowNormals.j3md");
teapot.setMaterial(mat);
rootNode.attachChild(teapot);
Загрузить сцену Вы загружаете сцену точно также, как загружаете модели:

Spatial scene = assetManager.loadModel("Scenes/town/main.scene");
rootNode.attachChild(scene);
Spatial scene = assetManager.loadModel("Scenes/town/main.j3o");
rootNode.attachChild(scene);

NullPointerException: Не удается найти ресурс?

Проблема:

Моя игра работает отлично, когда я запускаю ее прямо из jMonkeyEngine SDK. Но когда я запускаю автономные исполняемые файлы (.jar, .jnlp .exe, .apps), Desktop AssetManager выдает в консоль сообщение об ошибке, и он завершает работу?

com.jme3.asset.DesktopAssetManager loadAsset
WARNING: Cannot locate resource: Scenes/town/main.scene
com.jme3.app.Application handleError
SEVERE: Uncaught exception thrown in Thread[LWJGL Renderer Thread,5,main]
java.lang.NullPointerException

Причина:

Если вы используете сценарий сборки по умолчанию, исходные модели и сцены (.mesh.xml, .obj, .blend, .zip), автоматически исключаются из дистрибутива. Автономный исполняемый файл включает только преобразованные .j3o файлы (модели и сцены) только. Сценарий сборки по умолчанию позволяет объединить существующие .j3o файлы в дистрибутиве, но вам нужно не забыть, самостоятельно конвертировать модели (из mesh.xml–>.j3o, или .obj–>.j3o и т.д.).

Решение

Перед сборкой исполняемого файла, необходимо использовать контекстное меню в jMonkeyEngine SDK для преобразования 3D-моделей в .j3o двоичный формат.

  1. Сохраните ваши исходные модели (файлы .mesh.xml, .scene, .blend или .obj плюс текстуры) в assets/Textures/. (!)
  2. Откройте jME3 проект в jMonkeyEngine SDK.
  3. Перейдите в папку assets в окне Проекты.
  4. Щелкните [ПК мыши] исходную модель(в изначальном формате) в assets/Textures/, и выберите «Преобразовать в j3o двоичный» (“Convert to j3o Binary”).
  5. Преобразованный файл появится в той же папке, что и исходный файл. Он имеет то же имя, и суффикс .j3o.
  6. Переместите файл .j3o в assets/Models/ или assets/Scenes/ директорию.
  7. Для загрузки файла .j3o используйте метод load() из assetManager.

Это гарантирует, что пути текстур для вашей моделей из 3D редактора сетки, будут продолжать работать и в JME3.

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

Работа с игровыми ресурсами в других IDE: Codeless проекты

Проблема:

Я использую другой IDE, вместо jMonkeyEngine SDK для кодинга (Eclipse, IntelliJ, текстовый редактор). Где находится моя папка asset и .j3o конвертор?

Решение:

Вы можете программировать в любой IDE, но вы должны создать так называемый codeless проект в jMonkeyEngine SDK для поддержки игровых ресурсов(assets). Codeless jMonkeyEngine проект не вмешивается со своими источниками или пользовательскими скриптами сборки. Вы просто используете его для преобразования моделей в .j3o двоичные файлы.

  1. Создайте свой проект (в Eclipse или любой другой), в чем вам нравится.
  2. Создайте каталог в папке вашего проекта и назовите его, например, assets
    Сохраните там ваши игровые ресурсы, как описано выше.
  3. Загрузите и установите jMonkeyEngine SDK.
  4. В SDK, перейдите в меню Файл → Импорт проекта → External Project Assets.
  5. Выберите (в Eclipse или любой другой) проект и папку ваших ресурсов в мастере импорта.
  6. Теперь вы можете открывать этот проект (из Eclipse или любой другой) в jMonkeyEngine SDK. 
    Конвертируйте ресурсы, как описано выше.
Если вы по какой то причине не используете SDK, вы все равно можете конвертировать модели в формат j3o: Загрузите любую модель в формате Ogre3D или формате Wavefront с AssetManager.loadModel() как spatial. Затем сохраните spatial виде j3o файла используя BinaryExporter.
Используйте контроль версий файла, и давайте членам команды возможность проверят ваш проект. Ваши разработчики могут открывать проект в Eclipse (и.т.д.), как они и привыкли. В дополнение к их графическим инструментам, попросите своих графических дизайнеров установить jMonkeyEngine SDK, и, проверить проект Codeless, который вы для них подготовите. Это легко осуществимо для не программирующих членов команды, чтобы просмотреть или сделать пред просмотр игровых ресурсов, для организации сцены, и преобразования файлов. В то же время, не-кодеры случайно не накосячат с кодом, а разработчики случайно не накосячат с игровыми ресурсами.

Переведено для jmonkeyengine.ru, оригинал
Автор перевода: BuGaGa

Добавить комментарий

Содержание

jMonkeyEngine.ru © 2017. Все права сохранены.