{"id":"alqw/animation-studio","name":"animation-studio","scope":"alqw","platform":"roblox","description":"Property animation, camera cutscenes and timeline playback for Animation Studio clips","version":"0.1.0","latest":"0.1.0","versions":["0.1.0"],"license":"MIT","licenseRating":"safe","licenseCaveats":[],"licenseVerified":true,"dependencies":{},"integrity":"22ca57826334225fe77ad4a39e4e5f676d282376ef6778e171fe576585e58149","likes":0,"downloads":0,"install":"forest install alqw/animation-studio","url":"https://forest.dev/p/roblox/alqw/animation-studio","files":"https://api.forest.dev/ai/package/roblox/alqw/animation-studio/files","readme":"# Animation Studio runtime\n\nWally-пакет `alqw/animation-studio@0.1.0` для воспроизведения клипов Animation Studio: свойства объектов, UI, пространственные пути, камеры, звук, события и готовые Animation ID. Работает на клиенте и сервере. Не имеет внешних зависимостей.\n\nРедактор Animation Studio создаёт библиотеку клипов формата **1**. Пакет содержит игровой проигрыватель и общий вычислитель кривых. Клипы, камеры и объекты вашей игры в публичный пакет не входят.\n\n## Установка в игру\n\nПосле публикации пакета добавьте в секцию `[dependencies]` игрового `wally.toml`:\n\n```toml\nAnimationStudio = \"alqw/animation-studio@0.1.0\"\n```\n\nВыполните `wally install`. В Rojo-проекте игры должно быть сопоставление:\n\n```json\n\"ReplicatedStorage\": {\n  \"Packages\": { \"$path\": \"Packages\" }\n}\n```\n\nВ `_template` это сопоставление уже есть. Для его исходников используйте `require(\"@pkg/AnimationStudio\")`: существующий darklua преобразует импорт. В обычном Studio используйте `require(ReplicatedStorage.Packages.AnimationStudio)`.\n\nWally-пакет всё равно становится ModuleScript внутри `ReplicatedStorage.Packages`; теперь его версией и обновлениями управляет Wally. Кнопка установки отдельного runtime из плагина для этого варианта не нужна.\n\n## Подготовка клипа\n\n1. В Animation Studio создайте клип, дорожки и ключи. Запомните точное имя клипа.\n2. Сохраните place. В нём должны оставаться `ReplicatedStorage.AnimationStudioLibrary` и анимируемые объекты. Для камер также сохраните `Workspace.AnimationStudioCameras`.\n3. Для камеры/UI выберите Context **Client**, для общих объектов **Server**. **Both** разрешает дорожку в обоих контекстах; избегайте одновременной записи одного свойства клиентом и сервером.\n4. При работе с Rojo сохраните редакторские данные вне дерева кода: разрешите неизвестные экземпляры на нужных корнях либо добавьте явные сохраняемые корни. В шаблоне SyncBack по умолчанию не экспортирует AnimationStudioLibrary и AnimationStudioCameras. Пример настроек — в `examples/template/README.md` проекта пакета.\n\n## Клиент: камера, UI и личная катсцена\n\nLocalScript в `StarterPlayerScripts`:\n\n```lua\nlocal RS = game:GetService(\"ReplicatedStorage\")\nlocal AnimationStudio = require(RS:WaitForChild(\"Packages\"):WaitForChild(\"AnimationStudio\"))\nlocal player = AnimationStudio.new(RS:WaitForChild(\"AnimationStudioLibrary\"), nil, {\n    Context = \"Client\",\n})\nplayer.Error:Connect(warn)\nplayer:Play(\"My Animation\")\n```\n\nВ `_template` замените require на `require(\"@pkg/AnimationStudio\")`. Пример контроллера для его Loader находится в `examples/template/AnimationController.luau`. Игровой код вызывает `controller:Play(\"My Animation\")` по кнопке или событию; контроллер не запускает клип при загрузке.\n\n## Сервер: общая дверь, платформа или свет\n\nВ обычном Script в `ServerScriptService` используйте такой же код с `{ Context = \"Server\" }`. У нужных дорожек выберите Server или Both. Для преобразований закрепите кинематические Parts через Anchored. Камеры проигрываются на клиенте.\n\n`examples/PlayAnimation.server.luau` и `examples/PlayAnimation.client.luau` показывают простой запуск. `examples/Cutscene.server.luau` и `.client.luau` показывают согласованный запуск клиента и сервера через RemoteEvent и `workspace:GetServerTimeNow()`; они используют клип **Demo Cutscene** из редакторской демосцены.\n\n## Привязки и динамические объекты\n\nПо умолчанию проигрыватель читает ObjectValue из `AnimationStudioLibrary.Bindings`. Имена объектов можно менять. При переносе в другой place проверьте поля Value и замените потерянные цели. Для созданных во время игры объектов передайте переопределения:\n\n```lua\nlocal player = AnimationStudio.new(library, {\n    Door = workspace:WaitForChild(\"AnotherDoor\"), -- Door — имя привязки из Bindings\n}, { Context = \"Server\" })\nplayer:Play(\"Door Open\")\n```\n\nВместо Folder с данными можно передать массив таблиц клипов формата 1. Тогда все привязки передаются явно. GUI-привязки из StarterGui разрешаются в PlayerGui; дождитесь создания нужного GUI перед запуском.\n\n## API\n\n```lua\nlocal player = AnimationStudio.new(library, bindings, { Context = \"Client\" })\nplayer:Play(\"My Animation\", { Loop = false, Speed = 1 })\nplayer:Pause()\nplayer:Seek(1.5)       -- Секунды; маркеры не вызываются.\nplayer:Resume()\nplayer:SetSpeed(0.5)\nplayer:Stop()          -- Восстановить исходные свойства и камеру.\nplayer:Destroy()       -- Остановить и отключить соединения.\n```\n\nPlay принимает `Loop`, `Speed`, `Time`, `Paused`, `RestoreOnFinish`, `StartServerTime`, `ManualStep`. Последний параметр позволяет обновлять время через `player:Step(deltaSeconds)` вместо подключения к RunService. По умолчанию контекст определяется средой запуска.\n\nСобытия: `MarkerReached(name, payload, trackId)`, `Finished(clipName)`, `Error(message)`. При естественном завершении итоговые свойства сохраняются, камера возвращается игроку, собственные звук и AnimationTrack очищаются. `RestoreOnFinish = true` восстанавливает также свойства. `Stop({ Restore = false })` сохраняет текущие свойства объектов. Один экземпляр player воспроизводит один клип; независимым одновременным клипам нужны отдельные player.\n\nКлипы объектов и камер используют формат Animation Studio. Экспорта в Animation ID, FBX или видео здесь нет.\n\n## Разработка и публикация\n\nNode.js нужен только для локальных проверок с ограничением потоков и времени. В игре Node.js не используется.\n\n```bat\nrokit install\nnode scripts/run-tool.cjs lune run scripts/check.luau\n```\n\nПроверки выполняются последовательно: формат, численные тесты кривых, модельные тесты runtime, сборка Rojo, упаковка Wally и проверка содержимого архива. Studio, фоновые серверы и PowerShell не запускаются. `dist/AnimationStudioRuntime.rbxmx` — дополнительная сборка модуля; `dist/animation-studio-0.1.0.zip` — проверенный архив Wally.\n\nДля первой публикации из папки с этим `wally.toml`:\n\n```bat\nwally login\nwally publish\n```\n\nПубликующий аккаунт должен иметь права на scope `alqw`. Перед последующими публикациями увеличьте `package.version` в wally.toml и снова выполните проверки. Здесь ничего автоматически не публикуется.\n\nПроект подготовлен из runtime редактора Animation Studio. При экспорте исходники семи модулей копируются без изменений; версия формата библиотеки и API сохраняются. Ссылки: [Wally manifest](https://github.com/UpliftGames/wally#manifest-format), [Rojo](https://rojo.space/docs/v7/).\n","readmeTruncated":false}