3D 세계 내에서 두 개의 3D 개체가 접촉할 때 충돌이 발생합니다.사용자 지정된 충돌 처리를 위해 BasePart 에는 충돌 이벤트 및 충돌 필터링 기술 세트가 있으므로 물리적 조립이 다른 조립과 충돌하는지 제어할 수 있습니다.
충돌 이벤트
충돌 이벤트 는 3D 세계에서 두 개의 BaseParts 또는 터치를 중지할 때 발생합니다.이러한 충돌은 어느 부분의 CanCollide 속성 값과 상관없이 발생하는 Touched 및 TouchEnded 이벤트를 통해 감지할 수 있습니다.부품의 충돌 처리를 고려할 때 팔로잉사항을 참고하십시오:
- 부품의 속성은 다른 부품과 물리적으로 충돌하고 힘이 작용하게 하는지 여부에 영향을 줍니다.부품에 대해 CanCollide 가 비활성화되더라도 Touched 및 TouchEnded 이벤트를 통해 터치와 터치가 아닌 것을 감지할 수 있습니다.
- 및 이벤트는 부품이 서로 겹치거나 서로 겹치지 않도록 하는 변경 사항이 아닌 물리적 이동의 결과로만 발생합니다.
- 최상위 클래스 는 상위 클래스 에서 상속하므로 다른 클래스 가 지형 복셀과 충돌하는지 여부를 결정하기 위해 충돌 그룹 을 할당할 수 있습니다.
터치됨
Touched 이벤트는 다른 것이나 BasePart 또는 지형 복셀과 접촉할 때 발생합니다.그것은 단지 물리적 시뮬레이션의 결과로만 발사되며, 부품의 **** 또는 Position 또는 CFrame 가 다른 부품이나 복셀과 교차하도록 명시적으로 설정될 때만 발사되지 않습니다.
다음 코드 패턴은 Touched 이벤트를 사용자 지정 onTouched() 함수에 연결하는 방법을 보여줍니다.이벤트는 충돌에 관련된 다른 부분을 나타내는 otherPart 인수를 함수에 전송하여 이벤트가 충돌 관련 부분을 나타냅니다.
부품 충돌
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local function onTouched(otherPart)
print(part.Name .. " collided with " .. otherPart.Name)
end
part.Touched:Connect(onTouched)
이벤트 가 미세한 물리적 충돌에 따라 빠르게 연속으로 여러 번 발생할 수 있으며, 이동 개체가 정지 위치에 "정착"하거나 충돌이 여러 부분 모델을 포함할 때와 같이 여러 번 발생할 수 있습니다.필요한 것보다 더 많은 이벤트를 트리거하지 않으려면 인스턴스 특성을 통해 "쿨다운" 기간을 강제하는 간단한 디바운스 시스템을 구현할 수 있습니다.
대기 시간으로 부품 충돌
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local COOLDOWN_TIME = 1
local function onTouched(otherPart)
if not part:GetAttribute("Touched") then
print(part.Name .. " collided with " .. otherPart.Name)
part:SetAttribute("Touched", true) -- 특성을 참으로 설정
task.wait(COOLDOWN_TIME) -- 대기 시간 지연 기간 기다리기
part:SetAttribute("Touched", false) -- 특성 재설정
end
end
part.Touched:Connect(onTouched)
터치 종료됨
The TouchEnded 이벤트는 전체 충돌 경계의 BasePart 가 다른 BasePart 또는 채워진 지형 복셀의 경계를 벗어날 때 발생합니다.그것은 단지 물리적 시뮬레이션의 결과로만 발사되며, 부품의 또는 가 다른 부품이나 복셀과 겹치지 않도록 명시적으로 설정될 때만 발사됩니다.
다음 코드 패턴은 TouchEnded 이벤트를 사용자 지정 onTouchEnded() 함수에 연결하는 방법을 보여줍니다.예를 들어 Touched와 같이, 이벤트는 다른 관련 부분을 나타내는 otherPart 인수를 함수에 보냅니다.
충돌 방지 감지
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " is no longer touching " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)
충돌 필터링
충돌 필터링 은 물리적 부품이 다른 부품과 충돌하는지 정의합니다.충돌 그룹을 통해 다수의 개체에 대한 필터링을 구성하거나 부품 간 기반에서 충돌을 NoCollisionConstraint로 제어할 수 있습니다.
충돌 그룹
충돌 그룹 은 전용 그룹에 BaseParts를 할당하고 다른 그룹의 그룹과 충돌하는지 여부를 지정할 수 있습니다.충돌하지 않는 그룹 내의 부품은 둘 다 자신의 CanCollide 속성이 true로 설정되어 있더라도 완전히 서로를 통과합니다.
Studio의 충돌 그룹 편집기 를 통해 쉽게 충돌 그룹을 설정할 수 있으며, 도구 모음의 충돌 그룹 버튼을 클릭하여 모델 탭의 모델 에 액세스할 수 있다.

편집기는 Studio의 왼쪽이나 오른쪽으로 결합을 선호하는 목록 보기 또는 더 넓은 테이블 보기 에서 작동하며, 결합을 위해 맨 위나 맨 아래로 이동합니다.

그룹 등록
편집기에는 이름을 바꾸거나 삭제할 수 없는 기본 충돌 그룹 이 하나 포함되어 있습니다.다른 그룹에 할당되지 않으면 모든 자동으로 이 기본 그룹에 속하며, 기본 그룹의 모든 다른 개체와 충돌합니다.
새로운 충돌 그룹을 생성하려면:
편집기 패널의 상단에 있는 그룹 추가 버튼을 클릭하고, 새로운 그룹 이름을 입력하고 Enter.새 그룹은 목록 뷰의 두 열 또는 테이블 뷰의 왼쪽 열과 상단 행에 모두 나타납니다.
필요한 경우 프로세스를 반복하여 각 그룹에 고유하고 설명적인 이름을 선택합니다.필드를 클릭하거나 선택하고 이름 변경 버튼을 클릭하여 개발 중에 그룹 이름을 변경할 수 있습니다.
그룹 충돌 구성
기본 구성에서는 모든 그룹의 개체가 서로 충돌합니다.한 그룹의 개체가 다른 그룹의 개체와 충돌하지 않도록 하려면, 해당 행/열의 상자를 선택 취소 하십시오.
다음 예제에서는 큐브 그룹의 개체가 문 그룹의 개체와 충돌하지 않습니다.

그룹에 개체 할당
Studio 편집기를 통해 등록한 그룹에 개체를 할당하려면: To assign objects to groups you've registered through the Studio editor
충돌 그룹의 일부로 적격한 하나 이상의 BaseParts를 선택하십시오.
행에 대해 ⊕ 버튼을 클릭하여 그룹에 할당합니다.개체는 한 번에 하나의 충돌 그룹에만 속할 수 있으므로 새 그룹에 배치하면 현재 그룹에서 제거됩니다.
할당되면 새 그룹은 개체의 CollisionGroup 속성에 반영됩니다.

StudioSelectable 충돌 그룹
Studio의 도구는 3D 뷰포트에서 클릭할 때 선택 후보 개체를 결정하기 위해 충돌 필터링 시스템을 사용합니다.할당된 충돌 그룹이 충돌하지 않는 개체 는 StudioSelectable 과 충돌하지 않을 것입니다.
예를 들어, 효과적인 영역이 큰 투명한 부품으로 정의된 레이싱 경험에 검문소가 있는 경우, 그 검문소를 검문소 충돌 그룹 에 할당하고 그 그룹을 StudioSelectable 으로 비충돌 상태로 만들어 기본 맵 지오메트리를 편집할 때 방해가 되지 않도록 할 수 있습니다.

플러그인 코드의 경우 커서 아래에서 부품을 찾을 때 를 충돌 그룹 필터로 지정하는 것이 좋습니다.이렇게 하면 플러그인이 빌트인 Studio 도구에서 크리에이터가 예상하는 선택 메커니즘과 일치할 수 있습니다.
권장 플러그인 선택 레이캐스트
local UserInputService = game:GetService("UserInputService")local Workspace = game:GetService("Workspace")local raycastParams = RaycastParams.new()raycastParams.CollisionGroup = "StudioSelectable" -- 규칙을 따르기 위해raycastParams.BruteForceAllSlow = true -- 그래서 "false"의 CanQuery가 있는 부품이 선택될 수 있습니다local mouseLocation = UserInputService:GetMouseLocation()local mouseRay = Workspace.CurrentCamera:ViewportPointToRay(mouseLocation.X, mouseLocation.Y)local filteredSelectionHit = Workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 10000, raycastParams)
부분 대 부분 필터링
차량 바퀴와 차체 사이의 충돌을 방지하기 위해 충돌 그룹을 설정하지 않고 두 특정 부품 간의 충돌을 방지하려면 충돌 없음 제약 조건을 고려하십시오.장점에는 다음이 포함됩니다:
- 충돌 그룹 및/또는 구성 스크립트가 필요하지 않으므로 사용자 지정된 충돌 필터링으로 모델을 쉽게 만들고 공유할 수 있습니다.
- 연결된 부품은 서로 충돌하지 않지만 다른 개체와 여전히 충돌할 수 있습니다.
캐릭터 충돌 비활성화
Roblox 플레이어 캐릭터는 기본적으로 서로 충돌합니다.이로 인해 특정 영역에 도달하기 위해 캐릭터가 서로 위로 점프하는 등 의도치 않은 흥미로운 게임 플레이발생할 수 있습니다.이 동작이 원하지 않는 경우 Script 에서 다음 ServerScriptService 을 통해 방지할 수 있습니다.
스크립트 - 캐릭터 충돌 비활성화
local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
local CollisionGroupName = "Characters"
PhysicsService:RegisterCollisionGroup(CollisionGroupName)
PhysicsService:CollisionGroupSetCollidable(CollisionGroupName, CollisionGroupName, false)
local function setCollisionGroup(model)
-- 모델의 모든 기존 부품에 충돌 그룹 적용
for _, descendant in model:GetDescendants() do
if descendant:IsA("BasePart") then
descendant.CollisionGroup = CollisionGroupName
end
end
end
Players.PlayerAdded:Connect(function(player)
player.CharacterAdded:Connect(function(character)
setCollisionGroup(character)
end)
-- 플레이어가 이미 캐릭터를 가지고 있는 경우 충돌 그룹을 즉시 적용합니다
if player.Character then
setCollisionGroup(player.Character)
end
end)
모델 충돌
Model 개체는 부품을 상속하는 대신 BasePart 에서 파생되지 않으므로 직접 BasePart.Touched 또는 BasePart.TouchEnded 이벤트에 연결할 수 없습니다.모델이 충돌 이벤트를 트리거하는지 여부를 결정하려면 자식을 루프하고 사용자 지정 onTouched() 및 onTouchEnded() 함수를 각 자식에 연결해야 합니다 BasePart .
다음 코드 샘플은 다중 부분 모델의 모든 BaseParts를 충돌 이벤트에 연결하고 다른 부분과의 총 충돌 수를 추적합니다.
모델 충돌
local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- 모델이 자체와 교차하는 인스턴스 무시
if otherPart:IsDescendantOf(model) then return end
-- 터치하는 모델 부품 수 증가
numTouchingParts += 1
print(model.Name, "intersected with", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- 자체와 겹치지 않는 모델의 인스턴스 무시
if otherPart:IsDescendantOf(model) then return end
-- 모델 부품 간 접촉 수 줄이기
numTouchingParts -= 1
print(model.Name, "un-intersected from", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
for _, child in model:GetChildren() do
if child:IsA("BasePart") then
child.Touched:Connect(onTouched)
child.TouchEnded:Connect(onTouchEnded)
end
end
메쉬 및 솔리드 모델 충돌
및 (솔리드 모델링으로 연결된 부품)는 의 하위 클래스이므로 메쉬와 솔리드 모델링된 부품은 일반 부품과 동일한 충돌 이벤트 및 충돌 필터링 옵션을 상속합니다.그러나 메쉬와 솔리드 모델링 부품은 일반적으로 더 복잡한 기하 구조를 가지고 있기 때문에 물리적 경계가 충돌 처리를 위한 시각적 표현과 얼마나 정확하게 일치하는지 결정하는 고유한 CollisionFidelity 속성이 있습니다.
CollisionFidelity 속성에는 가장 낮은 신뢰성과 성능 영향 순서대로 다음 옵션이 있습니다.
- 상자 — 작은 또는 상호 작용하지 않는 개체에 적합한 바인딩 충돌 상자를 생성합니다.
- 허브 — 덜 두드러진 홈이나 공간이 있는 개체에 적합한 볼록 허브를 생성합니다.
- 기본 — 부분적으로 상세한 상호 작용 요구 사항을 가진 복잡한 개체에 적합한 대략적인 충돌 모양을 생성합니다.
- 정밀한 곡선 분해 — 가장 정확한 정확도를 제공하지만 여전히 시각적 요소의 1:1 표현이 아닙니다.이 옵션은 가장 비싼 성능 비용을 가지며 엔진이 계산하는 데 더 오래 걸립니다.

충돌 신뢰도 옵션의 성능 영향과 이를 완화하는 방법에 대한 자세한 정보는 성능 최적화를 참조하십시오.