GameLogic выступает в качестве центрального компонента управления игровой логикой. Все события передаются в GameLogic и распределяются им соответствующим компонентам, что уменьшает связность кода.Transponder передает событие приближения игрока компоненту GameLogic. Компонент UIFactory создает UI-панель для ввода промпта.GameLogic как событие.GameLogic получает промпт игрока и передает его компоненту TripoClient (требуется TripoAPIKey).TripoClient вызывает компонент TripoAPI, который передает промпт на сервер Tripo. В это время TripoAPI выполняет сборку запроса, отправку запроса и опрос сервера на предмет ответа. При успешном ответе сервер возвращает TaskID модели. После завершения генерации модели TripoAPI снова передает TaskID модели на сервер Tripo для генерации скелета.TripoAPI передает URL модели компоненту TripoClient. TripoClient загружает и парсит эту модель в формате GLB с помощью плагина GLTFfast.RuntimeHumanoidAvatarBuilder. Этот компонент сопоставляет скелет модели формата GLB с системой UnityAvatar для реализации ретаргетинга анимации.TripoClient создает экземпляр модели в сцене. Теперь разработчики могут использовать существующие ресурсы анимации гуманоидов для управления моделью.GameLogic будет отслеживать ввод с клавиатуры игрока, меняя приоритет камеры модели и игрока, а также цель реагирования ThirdPersonController. Когда игрок нажимает клавишу F, он может управлять моделью. Повторное нажатие F выводит игрока из модели. В игре модель может быть как очень большой, так и очень маленькой, чтобы игрок мог проходить различные препятствия, а также может выполнять замену внешнего вида, реализуя системы настройки персонажа или скинов с низкими затратами.
Общая логика кода:
Основные GameObject
Конкретные шаги реализации:
Версия: unity2022.3.55
Исходный код и сцена находятся в исходном файле Assets-LowPoly Environment Pack-Demo-Demo1
1. Создание нового проекта
Откройте Unity, нажмите New Project (Создать проект).
Выберите конвейер URP (Universal Render Pipeline), назовите его TripoRuntimeTutorial и нажмите Create (Создать).
2. Импорт пакетов ресурсов
Откройте браузер, найдите Unity Asset Store. В Unity Asset Store найдите и загрузите следующие ресурсы (все бесплатные), или найдите соответствующие файлы в предоставленном нами проекте:
Starter Assets - ThirdPerson (официальный ресурс Unity, предоставляющий базовое управление персонажем от третьего лица) (при первом импорте, если появится запрос на перезапуск, следуйте ему и импортируйте снова)
Military FREE - Low Poly 3D Models Pack (предоставляет ресурсы для реквизита сцены)
LowPoly Environment Pack (для создания основы пустынной сцены)
Добавьте их в "Мои ресурсы", а затем в появившемся окне нажмите "Открыть в Unity" и загрузите.
После загрузки нажмите в верхнем меню Unity Assets > Import Package > Custom Package, последовательно импортируйте вышеуказанные пакеты ресурсов, нажимайте Import (Импорт) для всех.
3. Преобразование в URP материалы
Отфильтруйте все файлы Material или выберите все розовые аномальные модели в сцене, в Editor - Rendering - Materials - Convert to URP Materials, чтобы преобразовать материалы в URP-материалы.
4. Загрузка библиотеки зависимостей glTFast (для парсинга GLB-моделей)
Метод 1: Загрузка через Git (требуется установленный Git)
Нажмите в верхнем меню Window > Package Manager, в появившемся окне нажмите + > Add package from git URL. Введите URL: https://github.com/atteneder/glTFast.git, нажмите Add (Добавить), дождитесь импорта плагина glTFast.
Метод 2: Загрузка плагина Unity с официального сайта Tripo, который включает плагин glTFast.
На главной странице официального сайта в разделе "Ресурсы" найдите плагин Unity, загрузите его и импортируйте в Unity согласно инструкциям в пакете.
5. Открытие базовой сцены
В списке файлов Unity слева найдите путь Assets > LowPoly Environment Pack > Demo > Demo1, дважды щелкните, чтобы открыть эту сцену. Перетащите несколько моделей (например, танки, камни) из папки Assets > ithappy в сцену, чтобы создать простую среду.
1. Добавление префабов, связанных с игроком
В списке файлов Unity слева найдите путь Assets > StarterAsset > ThirdPersonController > Prefabs. Перетащите следующие три префаба в сцену:
MainCamera (Основная камера)
PlayerFollowCamera (Камера следования за игроком)
PlayerArmature (Модель персонажа игрока)
2. Настройка параметров камеры
Выберите PlayerFollowCamera в сцене, на панели свойств справа (Inspector) найдите компонент CinemachineVirtualCamera. Установите поля Follow и Look At на PlayerArmature под PlayerCameraRoot (можно найти среди дочерних объектов PlayerArmature).
Вышеуказанное — это скрипт управления от третьего лица, предоставленный Unity. Теперь нажмите кнопку Play (Воспроизвести) на панели инструментов Unity, используйте клавиши WASD для перемещения персонажа, персонаж и камера должны нормально следовать за движением.
1. Создание зоны триггера
В Assets-ithappy-Military FREE-perfab выберите модель (например, танк), щелкните правой кнопкой мыши по этой модели > Create Empty Child (Создать пустой дочерний объект), назовите его Trigger.
Выберите Trigger, на панели свойств справа нажмите Add Component > Box Collider, добавьте коллайдер.
Установите флажок Is Trigger (Триггер), нажмите Edit Collider, перетащите ручки коллайдера в сцене, чтобы его размер стал в 2 раза больше модели (покрывая область вокруг модели).
2. Написание скрипта события триггера
Щелкните правой кнопкой мыши в списке файлов Unity слева Assets > Create > C# Script, назовите его Transponder, откройте скрипт с помощью Cursor. Мы хотим, чтобы при входе/выходе игрока из коллайдера сообщение передавалось нашему компоненту GameLogic. В Cursor выберите модель, введите наш справочный промпт:
Пожалуйста, сгенерируйте C# скрипт Unity, который запускает события при входе/выходе игрока из коллайдера.
Требования: Имя компонента Transponder. Когда GameObject с тегом Player входит в коллайдер, запускается событие OnPlayerEnter. Когда игрок выходит, запускается событие OnPlayerExit.
Сохраните скрипт, затем перетащите скрипт Transponder на объект Trigger.
3. Создание менеджера игровой логики
В сцене щелкните правой кнопкой мыши > Create Empty, назовите его GameLogicManager, как контейнер для логических компонентов.
Под GameLogicManager создайте пустой дочерний объект, назовите его GameManager.
Затем создайте второй скрипт, назовите его GameManager, для обработки основной игровой логики.
Мы ссылаемся на компонент Transponder, затем отслеживаем события входа и выхода игрока. Пример промпта:
Пожалуйста, сгенерируйте C# скрипт Unity, имя компонента GameManager.
Требования: Отслеживать события OnPlayerEnter и OnPlayerExit компонента Transponder. При OnPlayerEnter вызывать скрипт UIFactory, чтобы создать экземпляр префаба UI-панели для промпта. При OnPlayerExit уничтожать этот префаб UI.
Сохраните скрипт, затем перетащите скрипт GameManager на объект GameManager и перетащите компонент Transponder в поле Transponder. На этом отслеживание событий входа/выхода игрока завершено.
4. Создание префаба UI-панели
Щелкните правой кнопкой мыши на панели Hierarchy (список объектов сцены) > UI > Panel, чтобы создать UI-панель.
Под панелью создайте два дочерних объекта: Text (подсказка) и InputField (поле ввода), отрегулируйте их положение и размер (можно предварительно просмотреть в окне Game).
Выберите всю панель, перетащите ее в папку Assets в списке файлов Unity слева, чтобы создать префаб (назовите его InputDialogPrefab).
Примечание: Если используется Unity TextMeshPro, необходимо сгенерировать шрифтовые активы с поддержкой китайского языка, иначе китайские символы будут отображаться как квадраты. Также можно напрямую использовать предоставленный нами актив NotoSansSC SDF, просто изменив шрифт в компоненте Text на NotoSansSC SDF.
5. Написание скрипта InputDialog: инициализация UI-панели и отслеживание ввода с клавиатуры игрока
Создайте скрипт InputDialog, в Cursor введите справочный промпт:
Пожалуйста, сгенерируйте C# скрипт Unity, имя компонента InputDialog.
Требования: Создать систему диалоговых окон с полем ввода TMP, включающую
TMP_Textдля отображения подсказки иTMP_InputFieldдля получения ввода.Переключение между двумя режимами с помощью клавиши Enter:
Первое нажатие Enter: активирует поле ввода и отключает контроллер движения игрока (например,
ThirdPersonController).Второе нажатие Enter: отправляет введенное содержимое и уничтожает диалоговое окно.
Если ввод пуст, сохранять фокус.
Прикрепите компонент InputDialog к префабу UI-панели и перетащите Text и InputField в зависимости панели.
6. Написание скрипта UIFactory: генерация UI-панели
Создайте новый C# скрипт, назовите его UIFactory, его цель — предоставить интерфейс для генерации префабов UI, выступая в качестве промежуточного слоя для предотвращения связности кода. Пример промпта:
Создайте C# скрипт с именем
UIFactory, реализующий паттерн фабрики для генерации UI-диалоговых окон. Конкретные требования следующие: имеется существующий UI-префаб, функция принимает положение и вращение для генерации UI, создает экземпляр UI в указанном положении и возвращает компонент InputDialog созданного UI.
7. Связывание зависимостей компонентов
Еще раз проверьте правильность связывания зависимостей компонентов. Убедитесь, что Tag панели Inspector PlayerArmature установлен на Player.
Выберите объект GameManager, на панели свойств справа перетащите поле Transponder и присвойте ему компонент Transponder на объекте Trigger в сцене.
Перетащите поле UIFactory и присвойте ему компонент UIFactory на объекте GameLogicManager.
После запуска игры, подойдя к объекту с установленным Trigger, вы увидите UI-панель. При отдалении UI-панель автоматически уничтожится. Обратите внимание, что в наших исходных файлах положение генерации панели жестко задано, пожалуйста, измените это значение в соответствии с атрибутами Transform выбранного вами Trigger. Или установите RenderMode компонента Canvas UI-префаба на ScreenSpace-Overlay, тогда UI будет отображаться как данные в экранном пространстве, а не в мировом пространстве.
На этом этапе мы пока не можем отправить промпты на сервер Tripo. Однако код, который нужно написать разработчикам, в основном закончен. Последующие сетевые запросы, генерация моделей, риггинг, сопоставление и адаптация, а также ретаргетинг анимации уже написаны нами и будут интегрированы в плагин Tripo For Unity в будущем.
Обязательно сначала создайте UIEvent в сцене, иначе UI не будет реагировать!
1. Импорт скриптов плагина Tripo
В списке файлов Unity слева найдите загруженные скрипты TripoClient.cs, TripoAPI.cs и RuntimeHumanoidAvatarBuilder.cs в исходном файле и перетащите их в папку Assets/Scripts.
Вышеуказанные скрипты TripoClient и TripoAPI обрабатывают отправку и получение сетевых запросов, а RuntimeHumanoidAvatarBuilder сопоставляет скелет модели с системой скелета Unity. TripoClient и TripoAPI — это упрощенная версия плагина Tripo For Unity, дополненная функцией риггинга. Эта версия также скоро будет обновлена, и тогда процесс станет еще удобнее.
2. Создание объекта Tripo Client
Под GameLogicManager создайте пустой дочерний объект, назовите его TripoClient.
Перетащите скрипты TripoClient.cs и TripoAPI.cs на этот объект.
На панели свойств справа найдите поле API Key компонента TripoClient и введите свой ключ Tripo API (необходимо заранее зарегистрировать учетную запись на официальном сайте Tripo; пользователи получают 600 бесплатных баллов каждый месяц).
3. Связывание логики передачи промптов
Поскольку были добавлены события ввода игрока, нам нужно добавить логику отслеживания для GameManager. В это время код GameManager уже должен отслеживать события OnPlayerEnter и OnPlayerExit.
В предоставленном примере кода функция обратного вызова уже определена, когда GameManager вызывает UIFactory для создания экземпляра. Конечно, есть и другие решения, но в этом примере промпт для дополнения этой части логики выглядит следующим образом. Обратите внимание, что если между компонентами есть зависимости, лучше предоставить ранее сгенерированный код в качестве контекста для AI:
В скрипте GameManager добавьте логику: когда срабатывает OnPlayerEnter, вызвать UIFactory для создания экземпляра ранее созданного префаба InputDialog. Когда срабатывает OnPlayerExit, уничтожить сгенерированный префаб. После подтверждения ввода игроком, передать промпт игрока в существующий скрипт TripoClient, пример вызова: tripoClient.TextToModel(prompt, pos);. Измените связанные скрипты.
Откройте скрипт GameManager.cs, найдите метод OnPromptConfirmed (функция, обрабатывающая подтверждение ввода), дополните внутренний код. Примечание: убедитесь, что поле tripoClient уже присвоено объекту TripoClient в компоненте GameManager.
4. Создание контейнера для моделей
В сцене создайте пустой дочерний объект, назовите его ModelContainer, как родительский узел для сгенерированных моделей.
Теперь запустите игру, введите промпт на панели, и вы обнаружите, что промпт успешно загружен на сервер Tripo. В панели Debug Unity и в "Ввод/Прогресс" TripoAPI вы можете увидеть ход генерации. Попробуйте сгенерировать свою модель!
Следующий шаг после генерации модели — это сопоставление существующих анимационных ресурсов со скелетом модели. Убедитесь, что скрипт RuntimeHumanoidAvatarBuilder скопирован в ваш проект. Он выполняет сопоставление скелета GLB-гуманоида с UnityAvator, а скрипт TripoClient автоматически присоединит его к сгенерированной модели.
Давайте упорядочим структуру и зависимости проекта. В это время, за исключением объектов окружения, созданные нами GameObject должны находиться в следующем состоянии перед началом игры. Разверните каждый скрипт, чтобы убедиться, что все значения присвоены. Если что-то пошло не так, сравните с нашим исходным файлом, чтобы определить, нет ли ошибки в присвоении компонента. Кроме того, поскольку в нашем случае модель представляет собой боевого робота, ее атрибуты Scale увеличены в десять раз, и связанные с Controller атрибуты также.
1. Добавление компонентов управления моделью
Выберите объект ModelContainer, последовательно добавьте следующие компоненты (все из пакета ресурсов Starter Assets):
Character Controller (Контроллер персонажа)
Player Input (Ввод игрока)
Third Person Controller (Контроллер от третьего лица)
В компоненте Third Person Controller установите поле Camera на MainCamera в сцене.
2. Настройка камеры модели
Создайте пустой дочерний объект, назовите его ModelCamera, добавьте компонент CinemachineFreeLook (требуется импорт плагина Cinemachine, который уже включен в пакет ресурсов Starter Assets).
Под ModelContainer создайте дочерний объект CameraRoot, измените его координату Y на 5 (высота талии модели).
Установите поля Follow и LookAt для ModelCamera на CameraRoot. В этот момент камера будет следовать за движением модели.
В данный момент сгенерированная модель должна воспроизводить анимацию простоя (idle), но ею еще нельзя управлять.
Вышеуказанные компоненты, CharacterController, PlayerInput, ThirdPersonController, BasicRigidBody, StarterAssetsInputs, предоставлены Unity StarterAssets и используются для обработки ввода игрока. Компонент Animator используется для управления анимацией, и Avator, сгенерированный компонентом RuntimeHumanoidAvatarBuilder, также будет автоматически присвоен его полю avator.
В качестве теста, когда вы отключите компонент PlayerArmature и его камеру, перетащите модель GLB, сгенерированную Tripo и привязанную к скелету, в качестве дочернего объекта ModelContainer и добавьте компонент RuntimeHumanoidAvatarBuilder. Во время выполнения игры вы будете управлять сгенерированной моделью. Последний шаг — обработать логику переключения управления.
Обновите логику на изображении ниже в функции Update GameLogic, где isLoad указывает, сгенерирована ли модель. Если нет, то нет необходимости ее обрабатывать. isInModel указывает, управляет ли игрок моделью или своим телом.
Когда игрок переходит от тела к модели, игрок и камера игрока отключаются. В этот момент плагин Cinemachine автоматически переключает камеру на нашу новую ModelCamera. И путем сброса ModelContainer, скрипты движения начинают действовать на модель.
Когда игрок возвращается от модели к телу, мы хотим, чтобы модель оставалась на месте, а тело игрока отображалось в текущем положении. В то же время камера и контроллер переключаются на тело игрока.
После завершения вышеуказанного кода, если модель существует, при нажатии F игрок войдет в модель и будет ею управлять. При повторном нажатии F, тело игрока появится в месте модели, а модель останется на месте.
Теперь основной функционал демо-версии завершен. Если вы хотите более изысканного представления, можете добавить дополнительную логику. Например, когда игрок приближается к модели, появляется UI-панель с подсказкой "Нажмите F, чтобы управлять моделью"; или сгенерировать несколько моделей, и игрок может выбрать одну из них для управления и так далее.
Итак, на этом этапе вы должны были реализовать весь контент демо-версии, и теперь можете свободно генерировать и управлять гуманоидными моделями по своему желанию.
Мы также планируем в крупном обновлении TripoV3.0 предоставить риггинг для совершенно новых существ, таких как четвероногие животные, птицы и т.д., а также оптимизировать существующие алгоритмы риггинга.
Если у вас возникнут какие-либо вопросы или предложения, пожалуйста, свяжитесь с нами!
moving at the speed of creativity, achieving the depths of imagination.