Va chạm

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

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ạmlọ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

  • Thuộc tính CanTouch của một phần xác định liệu nó có phải kích hoạt sự kiện va chạm hay không. Nếu đặt thành false, thì cả Touched và 1> Class.BasePart.TouchEnded|TouchEnd
  • Đặ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 TouchedTouchEnded 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à

Trong video trên, các thể hiện quay có trong các nhóm va chạm khác nhau để chúng va chạm với các thể hiện của một màu nhưng không phải với các thể hiện của màu của chúng

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.

Collision Groups tool indicated in Model tab of Studio

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.

List View example in Collision Groups Editor

Đă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:

  1. 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.

    New group added to Collision Groups Editor in List View
  2. 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 .

    Button and field indicated for renaming a group in the Collision Groups Editor

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 .

Group configured in List View of Collision Groups Editor

Gán Objet vào Nhóm

Để gán đối tượng vào nhóm bạn đã đăng nhập qua Studio editor :

  1. 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.

  2. 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.

    Plus button indicated in Collision Groups Editor for adding selected parts to a group

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속性.

Chosen collision group indicated as the part's CollisionGroup property

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

Checkpoints group configured to be non-collidable with StudioSelectable group

Đố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ắc
raycastParams.BruteForceAllSlow = true -- Để các bộ phận có CanQuery " false " có thể được chọn
local 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

MeshPartPartOperation (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.
Original mesh of castle tower

Để 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à