Kolizje

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Kolizja występuje, gdy dwa obiekty 3D wchodzą w kontakt w świecie 3D. Aby uzyskać dostosowany do ustawień kolizji, BasePart ma zestaw wydarzeń kolizji i filtrów kolizji, aby możesz kontrolować, które połączenia fizyczne kolidują z innymi.

Wydarzenia kolizji

Kolizje wydarzenia następują, gdy dwa BaseParts dotykają lub przestają dotykać w świecie 3D. Możesz wykryć te kolizje poprzez Class.BasePart.Touched|Touched

  • Właściwość CanTouch części określa, czy wszystkie zdarzenia kolizji są uruchomione. Jeśli ustawiono false, ani Touched ani 1> Class.BasePart.TouchEnded|TouchEnded1> nie będą działać.
  • Właściwość CanCollide pozwala na to, czy fizycznie będzie uderzać z innymi częściami i powodować, że siły będą działać na nich. Nawet jeśli Class.
  • Wydarzenia Touched i TouchEnded działają tylko w wyniku ruchu fizycznego, nie z powodu zmiany Class.BasePart.Position|Position lub zmiany 2>Class.BasePart.CFrame|CFrame2>, która pow
  • Klasa Terrain pochodzi z BasePart, więc możesz przypisać grupę kolizji do 1>Class.Terrain1>, aby określić, czy inne 4>Class.BasePart|Class.Part4> kolidują z woxelami 7>Terrain7>.

Dotknięty

Wydarzenie Touched działa, gdy BasePart wchodzi w kontakt z innym lub z woxlem Terrain. Występuje tylko w wyniku 2>simulacji fiz

Poniższy wzór kodu pokazuje, jak wydarzenie Touched można połączyć z niestandardową funkcją onTouched(). Uwaga, że wydarzenie wysyła argument otherPart funkcji, wskazując na inną część zaangażowaną w kolizję.

Kolizja części

local part = workspace.Part
local function onTouched(otherPart)
print(part.Name .. " collided with " .. otherPart.Name)
end
part.Touched:Connect(onTouched)

Uwaga, że wydarzenie Touched może wystrzelić wiele razy w szybkiej kolejności w zależności od subtelnych kolizji fizycznych, takich jak gdy ruchający obiekt "settles" w pozycji spoczynkowej lub gdy

Kolizja części z czasem odnowienia

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) -- Ustaw atrybut na prawdę
task.wait(COOLDOWN_TIME) -- Poczekaj na czas odnowienia
part:SetAttribute("Touched", false) -- Zresetuj atrybut
end
end
part.Touched:Connect(onTouched)

Dotykończony

Wydarzenie TouchEnded aktywuje się, gdy całe zakresy kolizji BasePart wygnać z zakresów in

Poniższy wzór kodu pokazuje, jak wydarzenie TouchEnded można połączyć z niestandardową funkcją onTouchEnded(). Jak Touched, wysyłuje argument 1> otherPart1> funkcji, wskazując na inną część zaangażowaną.

Wykrywanie niezderzalności

local part = workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " is no longer touching " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)

Filtrowanie kolizji

Kolizja filtrowanie określa, które części fizyczne kolidują z innymi. Możesz skonfigurować filtrowanie dla licznych obiektów poprzez grupy kolizji lub możesz kontrolować kolizje na bazie części do części przy użyciu 1>instancji Class.NoCollisionConstraint1>.

Grupy kolizji

Kolizja grupy pozwala Ci przypisać BaseParts do poświęconych grup i określić, czy lub nie kolidują z tymi w innych grupach. Członki w grupach niekolidujących przeprowadzają się nawzajem w pełni, nawet jeśli obie części mają ich Class.BasePart.CanCollide|CanCollide</

W filmie powyżej obiekty kręcące się znajdują się w różnych grupach kolizji, aby uderzać z obiektami innego koloru, ale nie z obiektami własnego koloru

Możesz łatwo ustawić grupy kolizji poprzez Studio's edytor grup kolizji, dostępny poprzez kliknięcie przycisku grup kolizji w zakładce Model.

Collision Groups tool indicated in Model tab of Studio

Funkcje edytora działają w jednej z funkcji List View, która ma na celu docking na lewej lub prawej stronie Studio lub w szerszym Tabela View, która ma na celu doking na górze lub dołu.

List View example in Collision Groups Editor

Rejestrowanie grup

Edytor włącza jedną domyślną grupę kolizji, która nie może być zmieniona lub usunięta. Wszystkie BaseParts automatycznie należą do tej domyślnej grupy, o ile nie przypisano do innej grupa, co oznacza, że będą one kolizować z wszystkimi innymi obiektami w grupadomyślnej.

Aby utworzyć nową grupakolizji:

  1. Kliknij przycisk Dodaj grupę po prawej stronie panelu edytora, wpisz nową nazwę grupy i kliknij Enter. Nowa grupa pojawia się w obu kolumnach widoku listy lub w obu lewych kolumnach i górnych rzędach widoku tabeli.

    New group added to Collision Groups Editor in List View
  2. Powtórz proces, jeśli to konieczne, wybierając unikalne i opisowe imię dla każdej grupa. Uwaga, że możesz zmienić nazwę grupapodczas rozwoju, klikając na jego polu, lub wybierając go i klikając przycisk zmień nazwę .

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

Konfigurowanie kolizji grup

Pod domyślną konfiguracją obiekty w wszystkich grupach kolidują ze sobą. Aby zapobiec kolidowaniu obiektów w jednej grupie z obiektami w innej grupie, Odznacz pudełko w rzędach/kolumnach odpowiednio.

W następnym przykładzie obiekty w grupie Kostki nie będą się łączyć z obiektami w grupie grupa.

Group configured in List View of Collision Groups Editor

Przydzielanie obiektów grupom

Aby przypisać obiektom grupy, której poprzednio zapisałeś za pomocą Studio:

  1. Wybierz jeden lub więcej BaseParts , które kwalifikują się jako część grupakolizji.

  2. Przydziel im grupę, klikając przycisk dla jego wiersza. Objekty można przypisać tylko do jednej grupy kolizji na raz, więc umieszczenie ich w nowej grupie usuwa je z ich obecnej grupa.

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

Po przydzieniu nowa grupa jest odzwierciedlona pod właściwością CollisionGroup obiektu.

Chosen collision group indicated as the part's CollisionGroup property

Grupa kolidencyjna StudioSelectable

Narzędzia w Studio używają filtra systemu kolizji, aby określić, które obiekty są kandydatami do wyboru, gdy kliknięto w oknie 3D. Objekty, których przypisano grupę kolizji, nie będą ignorowane.

Na przykład, jeśli masz czujniki kontrolne w doświadczeniu wyświetlanym, które obszary są zdefiniowane przez duże, przejrzyste części, możesz przypisać je do grupy Checkpoints i następnie uczynić tę grupę niedostępną z StudioSelectable, aby nie pojawiały się one podczas edytowania podstawowej geometrii mapy.

Checkpoints group configured to be non-collidable with StudioSelectable group

Dla kodu plugin, zaleca się, aby przypisać "StudioSelectable" jako filtr grupy kolizji dla swojego RaycastParams podczas znalezienia części pod kursorem. To pozwala na zgodzenie się z wybranymi mechanikami selekcji, które nauczyli się od wbudowanych narzędzi Studio.

Zalecane wybór plugin Raycast

local UserInputService = game:GetService("UserInputService")
local raycastParams = RaycastParams.new()
raycastParams.CollisionGroup = "StudioSelectable" -- Aby podążać za konwencją
raycastParams.BruteForceAllSlow = true -- Aby części z CanQuery „źle” można być wybrane
local mouseLocation = UserInputService:GetMouseLocation()
local mouseRay = workspace.CurrentCamera:ViewportPointToRay(mouseLocation.X, mouseLocation.Y)
local filteredSelectionHit = workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 10000, raycastParams)

Filtrowanie części do części

Aby zapobiec kolizji dwóch części bez ustawienia grup kolizji, takich jak między kołem pojazdu a jego ramą, rozważaj ograniczenie Bez kolizji. Zalety obejmują:

  • Nie są wymagane grupy kolizji i/lub skrypty konfiguracyjne, więc łatwo możesz tworzyć i dzielić się modelami z dostosowanymi filtrami kolizji.
  • Połączone części nie będą się wzajemnie kolidować, ale nadal mogą kolidować z innymi obiektami.

Wyłączanie kolizji postaci

Postacie graczy Roblox kolidują ze sobą domyślnie. To może prowadzić do ciekawszego, ale niecelowego rozgrywka, takiego jak ludzie skaczując na siebie nawzajem, aby dotrzeć do określonych obszarów. Jeśli to zachowanie nie jest pożądane, możesz go zapobiec poprzez następujące Script w ServerScriptService .

Skrypt - Wyłącz kollizje znaków

local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
PhysicsService:RegisterCollisionGroup("Characters")
PhysicsService:CollisionGroupSetCollidable("Characters", "Characters", false)
local function onDescendantAdded(descendant)
-- Ustaw grupę kolizji dla dowolnej części zależnej
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Characters"
end
end
local function onCharacterAdded(character)
-- Przetwarzaj obecnych i nowych potomnych dla ustawień fizyki
for _, descendant in character:GetDescendants() do
onDescendantAdded(descendant)
end
character.DescendantAdded:Connect(onDescendantAdded)
end
Players.PlayerAdded:Connect(function(player)
-- Wykryj, gdy postać gracza zostanie dodana
player.CharacterAdded:Connect(onCharacterAdded)
end)

Kolizje modelu

Model obiekty są kontenerami dla części, a nie dziedziczą się od BasePart , więc nie mogą bezpośrednio połączyć się z wydarzeniem Class.Base

Poniższy kod przykładu połączy wszystkie BaseParts modelu wieloczęściowego z wydarzeniami kolizji i śledzi całkowitą liczbę kolizji z innymi częściami.

Kolizja modelu

local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- Ignoruj przypadki, w których model łączy się z samym sobą
if otherPart:IsDescendantOf(model) then return end
-- Zwiększ liczbę części modelu dotykających
numTouchingParts += 1
print(model.Name, "intersected with", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Ignoruj przypadki, w których model nie jest ze sobą sparowany
if otherPart:IsDescendantOf(model) then return end
-- Zmniejsz liczbę części modelu dotykających
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

Kolizje sieci i modeli solidnych

MeshPart and PartOperation (części połączone przez solide modelowanie ) są podklasami 0> Class.Base

Właściwość CollisionFidelity ma następujące opcje, w kolejności od najniższej do najwyższej wierności i wpływu na wydajność:

  • Skrzynka narożnikowa — tworzy skrzynię narożnikową, idealną dla małych lub nieinteraktywnych obiektów.
  • Hull — Generuje konwazyjną hull, odpowiednią dla obiektów z mniej wyraźnymi zaznaczeniami lub korytarzami.
  • Domyślny — Produkuje około kształt kolidyjny, który wspiera skośność, odpowiedni dla złożonych obiektów z niestandardowymi wymaganiami interakcji.
  • PreciseConvexDecomposition — Oferuje najwyższą precyzję, ale nadal nie jest to 1:1 przedstawienie wizualne. Ta opcja ma najwyższy koszt wydajności i dłużej czasu wykonania dla silnika.
Original mesh of castle tower

Dla więcej informacji na temat wpływu wydajności opcji fidelności kolizji i sposobu ich mitigacji, zobacz Optymalizację wydajności. Dla kompleksowego przewodnika po tym, jak wybrać opcję fidelności kolizji, która zachowuje Twoje potrzeby i wymagania dotyczące wydajności, zobacz tutaj.