Roblox GuidebookБаза знаний
Русский ⌄

Studio / ROBLOX

Collision Groups в Roblox Studio: настройка двух групп и проверка

Создайте две группы для учебной сцены, задайте их взаимодействие в матрице и проверьте результат на физических деталях. Руководство различает настройку в Studio и серверный скрипт, а также объясняет актуальные методы Workspace.

Обновлено:

Что меняют группы столкновений #

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

Collision Groups позволяют задать правила столкновений для классов физических деталей. Вместо настройки каждой пары объектов вы назначаете BasePart группе и указываете в матрице, какие группы взаимодействуют. Название группы само по себе ничего не меняет: поведение задают назначение детали и связь в матрице.

Подготовьте безопасную учебную сцену #

Начните с нового пустого Baseplate или копии проекта. Сохраните сцену под отдельным именем. Добавьте широкий Anchored пол, стену и две небольшие детали-ящика: синие и оранжевые. Сделайте ящики незаанкеренными, оставьте между ними пространство и поставьте их над полом. На первой проверке важна физика, а не оформление.

У каждой детали проверьте CanCollide = true. Если он выключен, деталь не будет оказывать обычное физическое сопротивление даже при разрешённой паре групп. Убедитесь, что ящики — BasePart (например, Part или MeshPart), а не папки или модели. Группу назначают частям; если у модели несколько деталей, нужно проверить все подходящие части.

Пара группНастройкаОжидаемо в учебной сцене
BlueCrates ↔ BlueCratesВключеноСиние ящики упираются друг в друга
OrangeCrates ↔ OrangeCratesВключеноОранжевые ящики упираются друг в друга
BlueCrates ↔ OrangeCratesВыключеноРазные цвета проходят друг сквозь друга
BlueCrates ↔ DefaultВключеноСиний ящик касается пола и стены
OrangeCrates ↔ DefaultВключеноОранжевый ящик касается пола и стены

Спланируйте матрицу до назначения деталей #

Используйте группы BlueCrates и OrangeCrates. Матрица должна оставить столкновения с Default включёнными, а связь между двумя учебными группами выключить. Для проверки полезно добавить по два ящика в каждую группу.

Матрица — таблица пар, а не настройка одного направления. Взаимодействие между A и B относится к обеим группам: если BlueCrates не сталкивается с OrangeCrates, оранжевый ящик также проходит сквозь синий. Строка группы с самой собой отвечает за две детали внутри этой группы. Не отключайте её, если ящики одной команды должны толкаться друг о друга.

Создайте группы в редакторе Studio #

Откройте редактор Collision Groups. В актуальной документации Roblox он доступен через меню Window > 3D; расположение и название панели могут меняться между версиями Studio. Выберите Workspace, если редактор предлагает выбрать мир. Добавьте BlueCrates и OrangeCrates через Add Group, вводя уникальные имена.

В редакторе по умолчанию существует Default: все части начинают в этой группе; её нельзя переименовать или удалить. Проверьте, что новые группы появились в таблице, затем выключите только ячейку пересечения BlueCrates/OrangeCrates. Если редактор показывает отдельную ячейку для каждой стороны матрицы, проверьте парное состояние. Сохраните проект.

Назначьте группе именно нужные BasePart #

Выберите оба синих ящика в окне 3D и добавьте выбранные части в строку BlueCrates кнопкой плюс (в описании Roblox это ⊕). Повторите для оранжевых. Точное оформление панели зависит от сборки Studio. После назначения выделите каждый ящик и найдите свойство CollisionGroup в Properties; оно должно совпадать с задуманным именем.

Назначение новой группе снимает часть с прежней группы: у детали только одна collision group одновременно. Для модели раскройте её и проверьте каждую физическую часть, иначе отдельный элемент может остаться в Default. Не путайте это свойство с CanCollide: первое выбирает правила группы, второе включает или выключает физическое столкновение детали.

Настройте матрицу и поймите её симметрию #

Ожидаемая матрица: BlueCrates ↔ BlueCrates — включено; OrangeCrates ↔ OrangeCrates — включено; BlueCrates ↔ OrangeCrates — выключено; каждая из двух групп ↔ Default — включено. Включённое значение означает, что пары групп могут физически сталкиваться при прочих подходящих настройках. Выключенное — что детали проходят друг сквозь друга, даже если у обеих CanCollide включён.

Если требуется только исключить конкретную пару отдельных частей, Roblox предлагает рассмотреть NoCollisionConstraint. Collision Groups удобнее, когда правило относится ко множеству объектов. Не добавляйте десятки групп для объектов, которым нужно лишь одно индивидуальное исключение.

Матрица: разные группы проходят друг сквозь друга, обе сталкиваются с Default.Открыть изображение крупнее ↗
Оригинальная учебная схема правил групп; не снимок интерфейса Studio и не результат теста.

Тот же пример через серверный скрипт #

Для понимания серверной настройки можно использовать эквивалентный пример в обычном Script внутри ServerScriptService. Создайте в Workspace две детали с именами BlueCrate и OrangeCrate. Следующий код регистрирует группы только если их ещё нет, настраивает связь и назначает части:

RegisterCollisionGroup, IsCollisionGroupRegistered и CollisionGroupSetCollidable документированы на Workspace/WorldRoot. Операции создания и изменения отношений должны выполняться сервером. Для проекта удобнее заранее создать и настроить группы редактором Studio; Roblox отмечает небольшой расход при регистрации, зависящий от числа частей в Workspace. Не используйте устаревшее PhysicsService:CreateCollisionGroup() или SetPartCollisionGroup() в новом примере: текущая справка помечает API PhysicsService устаревшим и перенаправляет управление к Workspace.

Этот короткий код намеренно назначает лишь две одиночные детали. Он не обрабатывает все части моделей или персонажей; при расширении нужно явно обходить потомков и назначать каждую BasePart. Имена экземпляров должны совпасть с Explorer.

local workspace = game:GetService("Workspace")
local blueName = "BlueCrates"
local orangeName = "OrangeCrates"

for _, name in {blueName, orangeName} do
    if not workspace:IsCollisionGroupRegistered(name) then
        workspace:RegisterCollisionGroup(name)
    end
end

workspace:CollisionGroupSetCollidable(blueName, blueName, true)
workspace:CollisionGroupSetCollidable(orangeName, orangeName, true)
workspace:CollisionGroupSetCollidable(blueName, "Default", true)
workspace:CollisionGroupSetCollidable(orangeName, "Default", true)
workspace:CollisionGroupSetCollidable(blueName, orangeName, false)
workspace.BlueCrate.CollisionGroup = blueName
workspace.OrangeCrate.CollisionGroup = orangeName

Проверьте поведение в отдельном запуске #

Сохраните сцену, затем используйте режим запуска Studio, который запускает симуляцию (например, Play). Это план проверки, а не выполненный здесь тест: Studio не запускалась и результат физики не наблюдался.

Поставьте синие и оранжевые ящики так, чтобы они столкнулись; при выключенной паре ожидается прохождение сквозь другой цвет. Синий об синий должен дать столкновение, оранжевый об оранжевый — тоже. Каждый ящик должен остановиться о пол и стену из Default. Остановите симуляцию, поменяйте только связь Blue/Orange на включённую, снова запустите и сравните именно эту пару. Перед каждым сравнением проверяйте стартовые позиции и CanCollide.

Запишите фактический результат после собственного запуска. Один тест в локальной симуляции не доказывает корректность для всех сетевых сценариев или устройств.

Проверяйте одну пару за запуск. Поставьте нижний ящик на пол, верхний — прямо над ним с воздушным зазором; оба остаются незаанкеренными. При запуске верхний падает на нижний. Ожидается упор для одинаковых групп и прохождение через другой цвет при выключенной связи. Затем разрешите связь разных цветов и повторите ту же расстановку. Для стены поставьте ящик рядом и подтолкните его персонажем; отдельно проверьте пол. Запишите наблюдение после своего запуска, не подменяя его ожидаемым результатом.

Последовательность проверки от создания групп до симуляции.Открыть изображение крупнее ↗
Оригинальный план ручной проверки; запуск здесь не выполнялся.
НаблюдениеПроверьте сначалаСледующее действие
Разные группы сталкиваютсяНазначение обеих деталей и ячейку матрицыУбедиться, что редактируете активный Workspace
Ящик проваливается в полCanCollide обеих деталей; связь с DefaultПроверить физические свойства пола
Часть модели ведёт себя иначеCollisionGroup каждой BasePart моделиНазначить оставшиеся части и повторить
Код не находит группуИмя и результат регистрацииПроверить написание и серверный контекст
Touched сработал сквозь детальОтдельную семантику события касанияДля физического упора проверять движение

Разберите типичные причины неожиданного результата #

Если два цвета всё равно сталкиваются, проверьте три вещи по очереди: обе части действительно назначены разным группам; в матрице связь между ними выключена; обе части проверяются в том же Workspace, который редактировался. Затем проверьте, что CanCollide не перепутан с группой и что у модели не остались детали в Default.

Если ящик проваливается сквозь пол, проверьте связь его группы с Default и CanCollide пола/ящика. Если скрипт сообщает о неизвестной группе, регистрация не произошла или имя отличается по регистру/написанию. Метод CollisionGroupSetCollidable выдаёт ошибку для незарегистрированной группы — поэтому пример сначала проверяет и регистрирует их.

События Touched — отдельная тема: документация Roblox указывает, что они могут срабатывать независимо от CanCollide. Не используйте одно событие касания как доказательство физического упора.

Зафиксируйте наблюдение и выберите следующий шаг #

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

Дальше можно усложнить сцену: назначать группу всем частям модели при добавлении, проверить персонажей или сравнить группу с NoCollisionConstraint. Каждое расширение требует собственной проверки. В этом примере учебная цель достигнута, когда вы можете по матрице предсказать исход столкновения и затем подтвердить его запуском Studio.

Первоисточники

Roblox Creator Hub — Collisions
Roblox Creator Hub — WorldRoot
Roblox Creator Hub — PhysicsService (legacy API status)
Roblox Creator Hub — Physics