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ść 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</
Możesz łatwo ustawić grupy kolizji poprzez Studio's edytor grup kolizji, dostępny poprzez kliknięcie przycisku grup kolizji w zakładce Model.
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.
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:
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.
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ę .
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.
Przydzielanie obiektów grupom
Aby przypisać obiektom grupy, której poprzednio zapisałeś za pomocą Studio:
Wybierz jeden lub więcej BaseParts , które kwalifikują się jako część grupakolizji.
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.
Po przydzieniu nowa grupa jest odzwierciedlona pod właściwością CollisionGroup obiektu.
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.
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ć wybranelocal 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.
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.