Научитесь создавать 3D-игры с ИИ менее чем за 2 часа — программирование не требуется.

Общий процесс работы фрагмента кода (который можно использовать как промпт для генерации кода):

1. Логика движения игрока и генерация пользовательского интерфейса

  1. GameLogic представляет собой основной компонент управления игрой. Он получает все внутриигровые события и распределяет их по соответствующим подсистемам, эффективно уменьшая связность кода.
  2. Когда игрок приближается к рамке, содержащей BoxCollider, прикрепленный к ней компонент Transponder автоматически обнаруживает взаимодействие и передает событие приближения игрока компоненту GameLogic. В ответ UIFactory создает панель пользовательского интерфейса для ввода данных.
  3. Эта панель пользовательского интерфейса включает компонент InputDialog, который прослушивает ввод с клавиатуры игрока. Когда игрок нажимает Enter в первый раз, поле ввода активируется и получает фокус клавиатуры. После того как игрок заканчивает ввод и снова нажимает Enter, ввод отправляется как событие в GameLogic.
  4. Когда игрок отходит от рамки, содержащей BoxCollider, панель пользовательского интерфейса немедленно уничтожается.

2. Генерация модели и маппинг скелета (предоставляется TripoSDK)

  1. После того как компонент GameLogic получает ввод промпта от игрока, он передает промпт компоненту TripoClient (Примечание: необходимо предварительно предоставить действительный TripoAPIKey).
  2. TripoClient вызывает компонент TripoAPI для отправки промпта на сервер Tripo. В процессе TripoAPI собирает запрос, отправляет его и начинает регулярно опрашивать сервер для проверки обновлений. После успешного выполнения игрок получает TaskID для сгенерированной модели от сервера Tripo. Этот TaskID затем используется для запроса генерации скелета.
  3. После завершения процесса риггинга TripoAPI возвращает URL-адрес для загрузки модели в TripoClient. Затем TripoClient загружает и разбирает модель в формате GLB через плагин glTFfast.
  4. Далее компонент RuntimeHumanoidAvatarBuilder монтируется на модель. Этот компонент сопоставляет скелет GLB-модели с системой Unity Humanoid Avatar, что позволяет выполнять ретаргетинг анимации.
  5. Наконец, TripoClient создает экземпляр модели в сцене. На этом этапе разработчики могут использовать существующие ресурсы гуманоидной анимации для управления вновь сгенерированной моделью.

3. Передача управления

  1. Компонент GameLogic прослушивает ввод с клавиатуры игрока для динамического переключения управления между игроком и сгенерированной моделью. В частности, он регулирует приоритет камеры и переназначает целевой объект управления ThirdPersonController.
  2. Когда игрок нажимает клавишу F, управление передается от персонажа игрока к модели, позволяя игроку управлять ею. Повторное нажатие клавиши F возвращает управление игроку.
  3. В зависимости от сгенерированной модели, ее размер может варьироваться; от чрезвычайно большого до чрезвычайно маленького — это позволяет создавать уникальные игровые взаимодействия и позволяет игроку проходить через различные препятствия.
  4. Кроме того, внешний вид модели можно легко менять, что эффективно поддерживает недорогую систему кастомизации персонажей и скинов в игре.

Общая логика кода:

Главный GameObject

Конкретные шаги реализации:

Версия Unity: 2022.3.55

Путь к исходному коду и сценам: Assets-LowPoly Environment Pack - Demo - Demo1

1. Настройка проекта и импорт ресурсов:

  1. Создать новый проект

    1. Откройте Unity и нажмите New Project.
    2. Выберите шаблон URP (Universal Render Pipeline).
    3. Назовите проект TripoRuntimeTutorial и нажмите create.
  2. Импорт требуемого пакета ресурсов

Пожалуйста, откройте свой браузер и перейдите в Unity Asset Store. Найдите и загрузите следующие бесплатные пакеты (также доступны в предоставленных файлах проекта):

Добавьте в "Мои ресурсы", а в последующих всплывающих окнах нажмите "Открыть в Unity" и загрузите.

После загрузки каждого пакета перейдите в Unity > Assets (вверху меню Unity) > Import Package > Custom Package и импортируйте их по одному. Нажмите Import в каждом запросе.

  1. Конвертировать материалы в URP

Некоторые импортированные материалы могут выглядеть розовыми (указывая на проблему с шейдером). Для конвертации:

  • Отфильтруйте или выберите все розовые странно выглядящие модели в сцене.
  • Затем перейдите в Editor > Rendering > Materials и конвертируйте их в UPR-совместимые материалы.
  1. Установить зависимость glTFast (для загрузки GLB-моделей)

Вариант 1: Установка через Git (требует локальной среды Git)

  • Перейдите в Window > Package Manager, нажмите кнопку + > Add package from Git URL.
  • Введите URL: https://github.com/atteneder/glTFast.git, затем нажмите Add и дождитесь импорта плагина glTFast.

Вариант 2: Загрузка с официального сайта Tripo, который также включает плагин glTFast.

  • Посетите домашнюю страницу Tripo и перейдите в раздел Resources.
  • Загрузите плагин Unity, который уже включает зависимость glTFast.
  • Следуйте инструкциям по установке, приведенным в обучающем видео, входящем в пакет.
  1. Открыть сцену Demo
  • В окне проекта Unity перейдите по пути: Assets > LowPoly Environment Pack > Demo > Demo1
  • Дважды щелкните Demo1, чтобы открыть ее.

Для настройки вашей пользовательской среды:

  • Перетащите активы, такие как танки, камни или деревья, из папки Assets > ithappy в сцену.
  • Теперь вы можете свободно перемещать игрока по окружению.
  1. Добавить префаб, связанный с игроком

Перейдите по пути: Assets > StarterAsset > ThirdPersonController > Prefabs

Перетащите следующие три префаба на панель Hierarchy:

  • MainCamera
  • PlayerFollowCamera
  • PlayerArmature
  1. Установить параметры камеры
  • Выберите PlayerFollowCamera в сцене,
  • На панели свойств (Inspector) найдите компонент CinemachineVirtualCamera.
  • Установите Follow и Look At на PlayerCameraRoot (Примечание: можно найти среди дочерних компонентов PlayerArmature).

Вышеуказанная настройка использует скрипт контроллера от третьего лица, предоставленный Unity. На этом этапе, нажав кнопку Play на панели инструментов Unity, вы можете использовать клавиши WASD для управления движением персонажа. Персонаж и камера теперь должны двигаться и соответствующим образом настраиваться!

Отображение панели промптов при приближении игрока

Когда игрок приближается к определенному объекту, должна появляться панель ввода UI. Когда игрок отходит, панель должна исчезать.

  1. Создание области триггера
  • В каталоге Assets > ithappy > Military FREE > Perfab выберите модель (например, танк).
  • Щелкните правой кнопкой мыши по модели и выберите Create Empty Child, затем переименуйте его в Trigger.
  • Выберите объект Trigger, перейдите в Inspector, нажмите Add Component и добавьте Box Collider.
  • Установите флажок Is Trigger.
  • Нажмите Edit Collider и отрегулируйте его маркеры в окне Scene, чтобы масштабировать коллайдер до двойного размера модели, покрывая ее окружающую область.
  1. Создать скрипт события триггера
  • На панели Project, щелкните правой кнопкой мыши в папке Assets > Create > C# Script, назовите его Transponder и откройте скрипт с помощью Cursor.
  • Этот скрипт должен обнаруживать, когда игрок входит или выходит из коллайдера, и отправлять сообщение нашему компоненту GameLogic. Выберите модель в Cursor и введите наш эталонный промпт:

Пожалуйста, сгенерируйте скрипт Unity C# с именем Transponder, который вызывает OnPlayerEnter, когда GameObject с тегом "player" входит в коллайдер, и OnPlayerExit, когда игрок выходит.

  • Сохраните скрипт и перетащите компонент Transponder на объект Trigger в сцене.
  1. Управление игровой логикой

Щелкните правой кнопкой мыши в сцене > Create Empty, переименуйте его в GameLogicManager (служит контейнером логики).

  • Под GameLogicManager создайте еще один пустой дочерний объект и назовите его GameManager.
  • Создайте новый скрипт с именем GameManager, который будет обрабатывать основную логику сцены.

Мы цитируем компонент Transponder, а затем прослушиваем события, когда игроки входят или выходят. Эталонные слова промпта следующие:

Пожалуйста, сгенерируйте скрипт Unity C# с именем GameManager, который прослушивает.

  • События OnPlayerEnter и OnPlayerExit от экземпляра Transponder.
  • При OnPlayerEnter создайте префаб UI-промпта с помощью скрипта UIFactory.
  • При OnPlayerExit уничтожьте этот префаб UI.

После сохранения скрипта перетащите скрипт GameManager на объект GameManager и перетащите компонент Transponder в поле Transponder. Это завершает прослушивание событий входа и выхода игрока.

  1. Создать префаб UI-панели

В Hierarchy, щелкните правой кнопкой мыши > UI > Panel, чтобы создать новую панель.

  • Добавьте 2 компонента в дочерние элементы под панелью:

    • Text (для отображения инструкций по промпту)
    • InputField (для получения ввода от игрока)
  • Отрегулируйте макет и позиционирование, используя окно Game в качестве предварительного просмотра.

  • По завершении перетащите весь объект Panel в папку Assets, чтобы создать префаб.

    • Назовите его InputDialogPrefab.

Примечание: Если вы используете TextMeshPro, убедитесь, что назначен шрифт, совместимый с китайским языком, например NotoSansSC SDF, чтобы избежать квадратных символов в тексте.

  1. Создайте скрипт InputDialog: обработка логики ввода
  • Создайте скрипт Unity C# с именем InputDialog.

Эталонный промпт:

  • Пожалуйста, сгенерируйте скрипт Unity C# с именем InputDialog для управления диалоговым окном UI на основе TMP.
  • Он должен содержать TMP_Text для промпта и TMP_InputField для ввода.
  • При первом нажатии клавиши Enter: активировать поле ввода и отключить контроллер движения игрока (например, ThirdPersonController).
  • При втором нажатии клавиши Enter: отправить ввод, повторно включить движение и уничтожить диалоговое окно.
  • Сохранять фокус ввода до тех пор, пока не будет введен действительный ввод.

Прикрепите компонент InputDialog к InputDialogPrefab. Перетащите соответствующие объекты Text и InputField в их поля на компоненте (Dependencies).

  1. Создайте скрипт UIFactory: Создание экземпляра UI-панели

Создайте новый C# скрипт с именем UIFactory

Эталонный промпт:

  • Пожалуйста, сгенерируйте скрипт Unity C# с именем UIFactory, который следует паттерну "фабрика" для создания экземпляров диалоговых окон UI.
  • При заданном префабе UI, позиции и вращении, создайте экземпляр префаба с заданным преобразованием и верните его компонент InputDialog.

Этот компонент действует как посредник для отделения логики создания UI от обработки игровых событий.

  1. Связанные зависимости компонентов

Дважды проверьте, правильно ли назначены все зависимости компонентов.

  • Объект PlayerArmature в сцене должен иметь тег "Player".

В объекте GameManager назначьте:

  • Поле Transponder со скриптом Transponder объекта Trigger.
  • Поле UIFactory с компонентом UIFactory объекта GameLogicManager.

Тестирование: Нажмите Play в Unity.

  • Приблизьтесь к объекту с триггером — должна появиться панель ввода.
  • Когда вы отойдете, панель должна автоматически исчезнуть.

Примечание: В нашем исходном файле зафиксирована позиция, где генерируется панель. Измените это значение в соответствии со свойствами Transform выбранного вами Trigger. В качестве альтернативы вы можете установить Canvas > RenderMode префаба UI на ScreenSpace - Overlay, чтобы UI отображался в пространстве экрана и не входил в мировое пространство.

Отправка промпта в TripoAPI

На этом этапе мы еще не можем отправлять промпты на сервер Tripo в реальном времени. Однако необходимый код для отправки промптов, сетевых запросов, генерации моделей, риггинга скелета, маппинга, адаптера и ретаргетинга анимации уже готов. Эти скрипты будут полностью интегрированы в плагин Tripo for Unity в будущих обновлениях. (Примечание: Убедитесь, что система UIEvent существует в вашей сцене, прежде чем продолжить; в противном случае UI не будет реагировать!)

  1. Импортировать скрипт плагина Tripo

На панели проекта Unity (обычно слева) найдите исходные файлы TripoClient.cs, TripoAPI.cs и RuntimeHumanoidAvatarBuilder.cs из вашей папки загрузок.

  • Перетащите их в папку Assets/Scripts.

Вот что делает каждый скрипт:

  • TripoClient.cs и TripoAPI.cs: Обрабатывают отправку промптов и сетевую связь с сервером Tripo.
  • RuntimeHumanoidAvatarBuilder.cs: Сопоставляет скелет модели с гуманоидным ригом Unity с использованием плагина GLTFast.

TripoClient.cs и TripoAPI.cs представляют собой облегченные версии плагина Tripo For Unity, но с функциональностью риггинга. Мы продолжим обновлять и оптимизировать этот процесс в будущих выпусках.

  1. Создать компонент Tripo Client
  • Создайте пустой дочерний компонент в GameLogicManager и назовите его TripoClient.
  • Перетащите TripoClient.cs и TripoAPI.cs на этот новый объект, чтобы прикрепить скрипты.
  • В Inspector найдите поле API Key в компоненте TripoClient. Вставьте ваш ключ Tripo API (вы можете зарегистрировать аккаунт на официальном сайте Tripo и получать 600 бесплатных баллов ежемесячно).
  1. Ввод промпта и логика обратного вызова

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

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

Обновленное поведение: в скрипте GameManager

  • Когда срабатывает OnPlayerEnter, UIFactory создает экземпляр диалогового окна ввода (префаб InputDialog).
  • Когда срабатывает OnPlayerExit, диалоговое окно ввода уничтожается.

Как только игрок завершит ввод промпта, он будет передан скрипту TripoClient с примером вызова tripoClient.TextToModel(prompt, pos);. Измените связанные скрипты.

Изменить GameManager.cs:

  • Откройте скрипт GameManager.cs.
  • Найдите метод OnPromptConfirmed (он обрабатывает подтверждение ввода промпта).
  • Завершите внутренний код и убедитесь, что поле tripoClient правильно назначено в компоненте GameManager.
  1. Создать контейнер модели
  • В иерархии сцены создайте пустой дочерний компонент и назовите его ModelContainer
  • Используйте его в качестве родительского узла для всех динамически генерируемых моделей.

Проверьте свою настройку

  1. Нажмите кнопку Play в Unity.
  2. Введите промпт на панели.
  3. Вы должны увидеть, что промпт успешно загружен на сервер Tripo.
  4. Прогресс генерации появится в Unity Console, а также в поле "Input/Progress" компонента Tripo API.

Теперь вы готовы генерировать свою собственную AI-модель в Unity. Наслаждайтесь созданием!

Ретаргетинг анимации

После того, как модель была сгенерирована, следующим шагом является сопоставление существующих ресурсов анимации со скелетом вашей модели. Убедитесь, что скрипт RuntimeHumanoidAvatarBuilder был добавлен в ваш проект. Этот скрипт обрабатывает сопоставление гуманоидного GLB-скелета с Avatar Unity, а скрипт TripoClient автоматически прикрепит его к сгенерированной модели.

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

В противном случае, в нашей демонстрации модель представляет собой боевого меха, поэтому ее свойство Transform > Scale увеличено в десять раз. Это также относится к его свойствам, связанным с Controller.

  1. Добавить компонент управления моделью

Выберите компонент ModelContainer и последовательно добавьте следующие компоненты (все предоставляются пакетом Starter Assets):

  • Character Controller
  • Player Input
  • Third Person Controller

В компоненте Third Person Controller установите поле Camera на MainCamera в сцене.

  1. Настройка камеры для перемещения модели

Создайте пустой дочерний компонент, назовите его ModelCamera, и добавьте к нему компонент CinemachineFreeLook (вам нужно импортировать плагин Cinemachine, который включен в пакет Starter Assets).

Затем создайте дочерний компонент в ModelContainer, назовите его CameraRoot, и отрегулируйте его координату Y на 5 (высота талии модели). Присвойте поля Follow и LookAt компонента ModelCamera к CameraRoot. Теперь камера будет следовать за движением модели.

  1. Включить движение персонажа:

На этом этапе трансформер должен воспроизводить анимацию бездействия, но пока не может быть управляем.

Эти компоненты: CharacterController, PlayerInput, ThirdPersonController, BasicRigidBody и StarterAssetsInputs, предоставляются Unity StarterAssets и обрабатывают ввод игрока. Компонент Animator управляет анимацией, а Avatar, сгенерированный RuntimeHumanoidAvatarBuilder, будет автоматически назначен полю Avatar Animator'а.

Для тестирования:

  • Отключите компонент PlayerArmature и его камеру.
  • Перетащите сгенерированную Tripo GLB-модель (с риггингом) в сцену как дочерний компонент ModelContainer.
  • Добавьте компонент RuntimeHumanoidAvatarBuilder к новой модели.

Теперь во время выполнения трансформером можно управлять. Затем последний шаг — реализовать логику переключения управления.

  1. Реализовать переключение управления

Обновите следующую логику в функции Update вашего скрипта GameLogic:

  • isLoad указывает, была ли модель сгенерирована. Если false, пропустите процесс.
  • isInModel указывает, управляет ли игрок в данный момент трансформером или игроком.

При входе в трансформер:

  • Отключите игрока и камеру игрока.
  • Плагин Cinemachine автоматически переключит вид камеры на нашу вновь созданную ModelCamera.
  • Сброс ModelContainer для эффективного применения логики движения к трансформеру.

При выходе из трансформера:

  • Оставьте трансформер на месте.
  • Покажите персонажа игрока в текущей позиции трансформера.
  • Одновременно переключите управление и камеру обратно на игрока.

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

Последние штрихи

На этом этапе демо-версия функционально завершена. Если вы хотите улучшить пользовательский опыт, вы можете:

  • Отображать UI-подсказку (например, "Нажмите F, чтобы управлять моделью"), когда игрок приближается к трансформеру.
  • Поддерживать выбор одного из нескольких трансформеров, если их сгенерировано несколько.

Поздравляем!

Спасибо за вашу усердную работу! Теперь вы завершили всю демо-версию. Вы можете свободно генерировать и управлять моделями-трансформерами, используя свои собственные идеи и ассеты.

Нужна помощь?

Если вы столкнетесь с трудностями или у вас есть отзывы о TripoGame, пожалуйста, свяжитесь с нами по нашей официальной электронной почте! tripogame@vastai3d.com. Мы будем рады услышать вас!

Советы:

  1. Этот учебник предназначен для демонстрации того, как Tripo API может использоваться в игровом процессе в реальном времени. Сам дизайн игры предназначен только для справки. Мы надеемся активно решать потенциальные проблемы, с которыми могут столкнуться разработчики.

  2. В настоящее время демо-версия поддерживает генерацию только гуманоидных моделей из-за требований к риггингу. Если анимация отображается ненормально из-за нестабильных весов скелета, сгенерированных ИИ, используйте Avatar Mask для блокировки анимации проблемных частей тела. Например, в исходном файле уже отключена анимация рук в NoArmPerson Controller.

  3. Для более быстрой генерации вы можете использовать TripoV2/TripoV1Turbo. Просто замените номер model_version "v2.5-20250123" в скрипте TripoAPI на

    • v2.0-20240919
    • Turbo-v1.0-20250506.
  4. Модели FBX и GLB имеют разные ориентации, что может привести к проблемам с зависимостями при импорте. Если вам нужно импортировать FBX, используйте плагины, такие как TriLib, для загрузки модели и соответствующей адаптации.

Advancing 3D generation to new heights

moving at the speed of creativity, achieving the depths of imagination.