3D 세계 내에서 두 개의 3D 개체가 충돌하면 충돌 처리를 사용자 정의하기 위해 BasePart 에 충돌 이벤트 및 충돌 필터링 기술이 있습니다. 충돌하는 물리 조합을 다른 조합으로 조정하려면 충돌 이벤트 세트 및 <
충돌 이벤트
충돌 이벤트는 3D 세계에서 두 Class.BasePart|BaseParts 가 부딪히거나 부딪히지 않을 때 발생합니다. 이 충돌 이벤트는 Class.BasePart.Touched|
- 부품의 CanCollide 속성은 부품이 다른 부품과 물리적으로 충돌하는지 여부에 영향을 줍니다. 심지어 부품이 Class.BasePart.CanCollide
- Class.BasePart.Touched|Touched 및 TouchEnded 이벤트는 물리적 이동 결과로만 발생하며, Class.BasePart.Position|Position 또는 1>Class.BasePart.CFrame|CFrame1> 변경으로 인
- 최상위 클래스 Terrain 클래스는 BasePart 에서 상속되므로 충돌 그룹을 할당할 수 있습니다 Class.Terrain 에 대해 다른 1>Class.BasePart|BaseParts1> 가 충돌하는지 결정하려면
터치
Class.BasePart.Touched|Touched 이벤트는 BasePart 가 다른 사람이나 지형 복셀과 접촉하면 발생합니다. 이 이벤트는 물리적
다음 코드 패턴은 Touched 이벤트가 사용자 정의 onTouched() 함수에 연결하는 방법을 보여줍니다. 이벤트는 충돌에 참여하는 다른 부품을 나타내는 다른 부품을 보내는 함수를 나타냅니다.
부품 충돌
local part = workspace.Part
local function onTouched(otherPart)
print(part.Name .. " collided with " .. otherPart.Name)
end
part.Touched:Connect(onTouched)
Class.BasePart.Touched|Touched 이벤트는 숨겨진 물리적 충돌, 즉 이동 개체가 휴식 위치에 설정될 때나 충돌이 발생할 때 여러 번 발생할 수
쿨다운 부품 충돌
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)
터치 완료
Class.BasePart.TouchEnded|TouchEnded 이벤트는 전체 충돌 경계가 BasePart를 떠나면 발생합니
다음 코드 패턴은 TouchEnded 이벤트가 사용자 정의 onTouchEnded() 함수에 연결할 수 있는 방법을 보여줍니다. 마치 Touched 와 같이, 이벤트는 다른 부품을 참조하여 함
충돌 방지 검색
local part = workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " is no longer touching " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)
충돌 필터링
충돌 필터링은 다른 물리적 부품이 서로 충돌하는 정도를 정의합니다. 충돌 그룹을 통해 여러 개의 개체에 대한 필터링을 구성하거나 충돌 기반의 부품 간 충돌 제어를 통해 충돌을 제어할 수 있습니다.
충돌 그룹
충돌 그룹을 사용하면 다른 그룹의 사람과 충돌하는지 여부를 지정하고 Class.BasePart|BaseParts 를 전용 그룹에 할당할 수 있습니다. 충돌하지 않는 그룹 내의 부품은 서로 완전히 통과하지만,
Studio의 충돌 그룹 편집기를 클릭하여 충돌 그룹을 쉽게 설정할 수 있습니다. 충돌 그룹 버튼을 클릭하여 모델 탭에서 액세스할 수 있습니다.
편집기는 Studio의 왼쪽이나 오른쪽에 있는 목록 보기 를 선호하는 경우, 또는 더 넓은 테이블 보기 를 선호하는 경우 도킹을 왼쪽이나 오른쪽으로 설정하거나 모든 경우 도킹을 위로 또는 아래로 설정합니다.
그룹 등록
편집기에는 이름을 변경하거나 삭제할 수 없는 하나의 기본 충돌 그룹이 포함되어 있습니다. 모든 BaseParts는 기본 그룹에 자동으로 속해야 하며, 다른 그룹에 할당되지 않으면 기본 그룹에 모든 다른 개체와 충돌합니다.
새로운 충돌 그룹을 생성하려면:
편집기 패널 상단의 그룹 추가 버튼을 클릭하고, 새 그룹 이름을 입력하고, Enter를 누릅니다. 새 그룹이 목록 뷰의 두 열 중 하나 또는 테이블 뷰의 왼쪽 행 및 상단 행에 나타납니다.
필요한 경우 프로세스를 반복하고 각 그룹에 고유하고 설명적인 이름을 선택합니다. 개발 중에 필드를 클릭하거나 이름 변경 버튼을 선택하여 그룹 이름을 변경할 수 있습니다.
그룹 충돌 구성
기본 구성에서 모든 그룹의 개체는 서로 충돌합니다. 한 그룹의 개체가 다른 그룹의 개체와 충돌하지 않도록 체크를 해제하십시오. 개체 행/열에 있는 상자에서 각각의 개체를 확인하십시오.
다음 예에서 큐브 그룹의 개체는 문 그룹의 개체와 충돌하지 않습니다.
그룹에 개체 할당
Studio 편집기를 통해 등록한 그룹에 개체를 할당하려면:
충돌 그룹의 일부인 선택 한 개 이상의 BaseParts 을 선택합니다.
그들을 그룹에 할당하려면 행에 대한 ⊕ 버튼을 클릭하십시오. 개체는 한 번에 하나의 충돌 그룹에만 할당될 수 있으므로 새 그룹에 배치하면 현재 그룹에서 제거됩니다.
할당되면 새 그룹이 개체의 CollisionGroup 속성 아래에 나타납니다.
StudioSelectable 충돌 그룹
Studio의 도구는 충돌 필터 시스템을 사용하여 3D 뷰포트에서 클릭할 때 선택할 대상을 결정합니다. 할당된 충돌 그룹이 없는 개체는 하지 않습니다 StudioSelectable 에 충돌하지 않습니다.
예를 들어, 대형 투명 부품으로 효과 영역이 정의된 레이싱 경험의 체크포인트가 있으면 체크포인트 그룹에 체크포인트를 할당하고 그룹을 스튜디오 선택 가능으로 만들어 기본 맵 기하구조를 편집할 때 방해를 받지 않도록 할 수 있
플러그인 코드의 경우, 커서 아래에 있는 부품을 찾을 때 "StudioSelectable" 의 충돌 그룹 필터로 RaycastParams 을 할당하는 것이 좋습니다. 이렇게 하면 플러그인이 크리에이터가 내장 Studio 도구에서 기대하는 선택 메커니즘을 충족시킬 수 있습니다.
권장 플러그인 선택 레이캐스트
local UserInputService = game:GetService("UserInputService")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 플레이어 캐릭터는 기본적으로 서로 충돌합니다. 이로 인해 특정 구역에 액세스하려는 캐릭터가 서로 위로 점프하여 이상한 게임 플레이가 발생할 수 있습니다. 이 행동이 원하지 않는 경우 ServerScriptService 내의 다음 Class.ServerScriptService 에서 사용할
스크립트 - 캐릭터 충돌 비활성화
local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
PhysicsService:RegisterCollisionGroup("Characters")
PhysicsService:CollisionGroupSetCollidable("Characters", "Characters", false)
local function onDescendantAdded(descendant)
-- 모든 하위 부품에 대한 충돌 그룹 설정
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Characters"
end
end
local function onCharacterAdded(character)
-- 물리 설정을 위해 이전 및 새로운 후손 처리
for _, descendant in character:GetDescendants() do
onDescendantAdded(descendant)
end
character.DescendantAdded:Connect(onDescendantAdded)
end
Players.PlayerAdded:Connect(function(player)
-- 플레이어의 캐릭터가 추가될 때 감지
player.CharacterAdded:Connect(onCharacterAdded)
end)
모델 충돌
Model 개체는 부품을 상속하는 대신 BasePart 개체이므로 직접 BasePart.Touched 또는 0>
다음 코드 샘플은 모든 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
메쉬 및 솔리드 모델 충돌
MeshPart 및 PartOperation (부품이 단순한 모델링으로 인해 동일한 충돌 이
Class.TriangleMeshPart.CollisionFidelity|CollisionFidelity 속성에는 다음과 같은 옵션이 있습니다. 최저 순위의 유사성과 성능 영향에 따라 순위가 낮은 순으로 나열됩니다.
- 상자 — 작은 개체나 상호 작용하지 않는 개체에 적합한 제한 충돌 상자를 만듭니다.
- 허블 — 오브젝트에 덜 두드러진 캐비티나 공간이 적은 개체에 적합한 복셀을 생성합니다.
- 기본 — 입고 표면 필요성을 지원하는 약 충돌 모양을 생성합니다. 복잡한 개체에 적합합니다.
- 정확한 콘벡스 데콤포지션 — 가장 정확한 정확도를 제공하지만 시각적 개체의 1:1 대표는 아닙니다. 이 옵션은 가장 비싼 성능 비용을 가지고 있으며 엔진이 계산하는 데 더 오래 걸립니다.
충돌 유사성 옵션의 성능 영향 및 얼마나 억제할 수 있는지에 대한 자세한 내용은 성능 최적화를 참조하십시오. 정확도 요구 사항과 성능 요구 사항을 균형 잡는 충돌 유사성 옵션을 선택하는 방법에 대한 자세한 내용은 여기를 참조하십시오.