Một vụ va chạm xảy ra khi hai đối tượng 3D đến tiếp xúc trong thế giới 3D. Đối với việc xử lý va chạm tùy chỉnh, BasePart có một bộ sự kiện va chạm và lọc va chạm技, so you can control which physical assemblies collide with others.
Sự kiện va chạm
Collision events xảy ra khi hai BaseParts chạm hoặc dừng chạm trong thế giới 3D. Bạn có thể phát hiện các collisions thông qua các s
- Đặc tính CanCollide của một phần ảnh hưởng đến việc có phải vật lý để va chạm với các phần khác v
- Các sự kiện Touched và TouchEnded chỉ xảy ra khi kết quả của cuộc di chuyển vật lý là không phải từ một 1>Class.BasePart.
- Lớp Terrain cấp cao nhất thừa hưởng từ BasePart, vì vậy bạn có thể giao một nhóm va chạm cho 1> Class.Terrain1> để xác định có phải đối thủ 4>
Đã chạm
Sự kiện Touched xảy ra khi một BasePart đến tiếp xúc với một voxel mặt địa hình
Mẫu mã code sau đây cho thấy cách sự kiện Touched có thể kết nối với một chức năng tùy chỉnh onTouched() . Lưu ý rằng sự kiện gửi argument otherPart cho chức năng, cho thấy bên kia liên quan trong cuộc va chạm.
Va chạm phần
local part = workspace.Part
local function onTouched(otherPart)
print(part.Name .. " collided with " .. otherPart.Name)
end
part.Touched:Connect(onTouched)
Lưu ý rằng sự kiện Touched có thể kích hoạt nhiều lần trong thành công nhanh chóng dựa trên những va chạm vật lý tinh tế, chẳng hạ
Va chạm phần với thời gian冷却
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) -- Đặt thuộc tính để true
task.wait(COOLDOWN_TIME) -- Đợi thời gian冷却
part:SetAttribute("Touched", false) -- Đặt lại giá trị
end
end
part.Touched:Connect(onTouched)
Đã kết thúc
Sự kiện TouchEnded khi toàn bộ giới hạn va chạm của một Class.BasePart
Mẫu mã code sau đây cho thấy làm thế nào sự kiện TouchEnded có thể được kết nối với một chức năng tùy chỉnh onTouchEnded() . Giống như Touched, sự kiện n
Không phải phát hiện va chạm
local part = workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " is no longer touching " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)
Lọc va chạm
Collision lọc 定義 các bộ phận vật lý nào va chạm với nhau. Bạn có thể tùy chỉnh lọc cho nhiều đối tượng thông qua nhóm va chạm hoặc bạn có thể kiểm tra va chạm trên cơ sở điểm dừng với 1> Class.NoCollisionConstraint1> 实例.
Nhóm va chạm
Collision groups cho phép bạn giao BaseParts cho các nhóm dành riêng và xác định có hay không phải collisions với những người trong các nhóm khác. Các bộ phận trong các nhóm không collisions thông qua nhau hoà
Bạn có thể dễ dàng tạo nhóm va chạm thông qua Collision Groups Editor của Studio, truy cập bằng cách nhấp vào nút Collision Groups trong Model tab.
Chức năng trình chỉnh sửa trong either Màn hình xem List which favors docking to the left or right side of Studio, or in a wider Table View which favors docking to the top or bottom.
Đăng ký Nhóm
Trình chỉnh sửa bao gồm một nhóm va chạm Mặc định mà không thể đổi tên hoặc xóa. Tất cả BaseParts đều tự động thuộc về nhóm này, có nghĩa là chúng sẽ va chạm với tất cả các đối tượng trong nhóm Mặc định Để tạo một nhóm va chạm mới:
Nhấp vào nút Thêm Nhóm ở phía trên của trang chủ của trình soạn, nhập tên nhóm mới, và nhấn Nhập. Nhóm mới xuất hiện ở cả hai cột của trang chủ danh sách, hoặc ở cả hai cột bên trái và bên trên của trang chủ bảng.
Lặp lại quá trình này nếu cần thiết, chọn một tên mô tả và độc đáo cho mỗi nhóm. Ghi chú rằng bạn có thể thay đổi tên một nhóm trong quá trình phát triển bằng cách nhấp vào trường của nó, hoặc bằng cách chọn nó và nhấp vào nút thay đổi tên .
Tùy chỉnh va chạm nhóm
Trong cấu hình mặc định, các thể thống nhất trong tất cả các nhóm va chạm với nhau. Để ngăn các thể thống trong một nhóm va chạm với các thể thống trong những cột/hàng cụ thể, bỏ chọn hộp trong cột/hàng tương ứng.
Trong ví dụ sau đây, các thể đối tượng trong nhóm Khối sẽ không để a với các thể đối tượng trong nhóm Cửa .
Gán Objet vào Nhóm
Để gán đối tượng vào nhóm bạn đã đăng nhập qua Studio editor :
Chọn một hoặc nhiều BaseParts có đủ điều kiện là một phần của nhóm va chạm.
Gán chúng cho nhóm bằng cách nhấp vào nút ⊕ cho hàng của nó. Các đối tượng chỉ có thể thuộc về một nhóm va chạm đơn ở một thời điểm, vì vậy đặt chúng trong một nhóm mới bỏ chúng khỏi nhóm hiện tại của chúng.
Một khi đã được gán, nhóm mới sẽ được phản ánh dưới đối tượng's Class.BasePart.CollisionGroup|CollisionGroup속性.
Nhóm va chạm StudioSelectable
Các công cụ trong Studio sử dụng hệ thống lọc va chạm để xác định các đối tượng là ứng viên cho sự lựa chọn khi nhấp vào cửa sổ 3D. Đối tượng có nhóm va chạm được giao phụ trách sẽ bị lãng quên.
Ví dụ, nếu bạn có checkpoints trong một trải nghiệm đua cuộn và có các khu vực hiệu quả được định nghĩa bởi các bộ phận trong suốt lớn, bạn có thể giao chúng cho một nhóm va chạm Checkpoints và sau đó làm cho nhóm đó không thể collide với StudioSelectable
Đối với mã plugin, nên bạn giao "StudioSelectable" làm lọc nhóm va chạm của RaycastParams khi tìm kiếm các bộ phận dưới cái chuột. Điều này cho phép các plugin của bạn khớp nối với các meха nhân vật mà người sáng tạo đã học để mong đợ
Lựa chọn Plugin tốt nhất Raycast
local UserInputService = game:GetService("UserInputService")local raycastParams = RaycastParams.new()raycastParams.CollisionGroup = "StudioSelectable" -- Để tuân theo nguyên tắcraycastParams.BruteForceAllSlow = true -- Để các bộ phận có CanQuery " false " có thể được chọnlocal mouseLocation = UserInputService:GetMouseLocation()local mouseRay = workspace.CurrentCamera:ViewportPointToRay(mouseLocation.X, mouseLocation.Y)local filteredSelectionHit = workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 10000, raycastParams)
Lọc dữ liệu từ nguồn
Để ngăn chặn va chạm giữa hai bộ phận cụ thể mà không cài đặt nhóm va chạm, chẳng hạn như giữa bánh xe của một xe và khung của nó, hãy xem Không va chạm hạn chế. Điều này bao gồm:
- Nhóm va chạm và/hoặc tập lệnh cấu hình không đòi hỏi, vì vậy bạn có thể dễ dàng tạo và chia sẻ mô hình với lọc va chạm tùy chỉnh.
- Các bộ phận kết nối sẽ không va chạm với nhau, nhưng chúng vẫn có thể va chạm với các bộ phận khác.
Vô hiệu hóa va chạm nhân vật
Các nhân vật người chơi Roblox phản xạ với nhau bởi mặc định. Điều này có thể dẫn đến một trò trải nghiệm trò chơithú vị nhưng không định hướng, chẳng hạn như nhân vật nhảy vào nhau để đạt đến các khu vực cụ thể. Nếu hà
Script - Vô hiệu hóa va chạm nhân vật
local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
PhysicsService:RegisterCollisionGroup("Characters")
PhysicsService:CollisionGroupSetCollidable("Characters", "Characters", false)
local function onDescendantAdded(descendant)
-- Tạo nhóm va chạm cho bất kỳ phần con của
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Characters"
end
end
local function onCharacterAdded(character)
-- Xử lý những con cháu hiện tại và mới cho cài đặt vật lý
for _, descendant in character:GetDescendants() do
onDescendantAdded(descendant)
end
character.DescendantAdded:Connect(onDescendantAdded)
end
Players.PlayerAdded:Connect(function(player)
-- Ngược khi nhân vật của người chơi được thêm
player.CharacterAdded:Connect(onCharacterAdded)
end)
Va chạm mô hình
Model ố
Mẫu mã code sau đây kết nối tất cả các BaseParts của một mô hình nhiều phần vào sự va chạm và theo dõi tổng số va chạm với các phần khác.
Va chạm mô hình
local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- Làm lơ các trường hợp của mô hình giao thoa với chính nó
if otherPart:IsDescendantOf(model) then return end
-- Tăng số lần chạm vào các bộ phận mô hình
numTouchingParts += 1
print(model.Name, "intersected with", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Làm lơ các trường hợp không xảy ra khi model không có sự kết nối với nhau
if otherPart:IsDescendantOf(model) then return end
-- Giảm số lần chạm vào các bộ phận mô hình
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
Va chạm mạng lưới và mô hình rắn
MeshPart và PartOperation (các bộ phận được kết hợp bằng mô hình
Chỉ số CollisionFidelity có các lựa chọn sau, theo thứ tự từ sự kiện đáng tin cậy và hiệu suất tốt nhất đến thứ hạng thấp nhất:
- Hộp hợp chất văn bản — Tạo một hộp va chạm giới hạn, lý tưởng cho các thiết bị nhỏ hoặc không tương tác.
- Hull — Tạo một thân hình hình chữ nhật, phù hợp với các đối tượng có độ lõm hoặc hầm rộng hơn.
- Mặc định — Sản xuất hình dạng va chạm khoảng cách khả dụng để hỗ trợ hầu hết các yêu cầu tương tác bán chi tiết của các thống nhất.
- PreciseConvexDecomposition — Cung cấp độ chính xác cao nhất nhưng vẫn không phải là đại diện 1:1 của thị giác. Tùy chọn này có chi phí hiệu suất đắt nhất và mất nhiều thời gian hơn cho máy chủ tính toán.
Để biết thêm thông tin về tác động hiệu suất của tùy chọn sự trung thành về va chạm và cách giảm bớt chúng, xem Tối ưu hóa Hiệu suất . Để có một hướng dẫn chi tiết về cách chọn một tùy chọn sự trung thành về va chạm để cân bằng các yêu cầu chính xác và