3D dünyasında iki 3D nesne ile çarpışırsa bir çarpışma olur. Özelleştirilmiş çarpışma işleme için, BasePart bir dizi çarpışma etkinliği ve çarpışma filtreleme tekniği vardır, böylece hangi fiziksel bileşenlerin diğerleriyle çarpıştığın
Çarpışma Etkinlikleri
Çarpışma etkinlikler gerçekleşir, bir BaseParts ile ilgileniyor veya dokunmaya başlar ise 3D dünyasında. Bu çarpışma ile takip edilenraporları
- Bir parçanın CanTouch özelliği, çarpışma olaylarını tetikleyip etkilemez. Eğer false olarak ayarlandıysa, ne Class.BasePart.Touched|Touched ne de 1> Class.BasePart.TouchEnded|TouchEnded1> çarpışma olaylarını etk
- Bir parçanın CanCollide özelliği, diğer parçalarla fizyiksel olarak çarpışıp kuvvetlerin etkisi altında kalmasını sağlar. Eğer
- Class.BasePart.Touched|Touched ve TouchEnded etkinlikleri sadece fizyiksel hareketin sonucu olarak çalışır, bir parçanın başka bir parçaya bağlanmasını veya etrafında dönd
- En üst seviye Terrain sınıfı, BasePart 'dan miras aldığından, bir çarpışma grubunu 11> Class.Terrain'a atayabilirsiniz, böylece diğer 4> Class.BasePart|BaseParts4> ile çarpışma ol
Dokunulmuş
Class.BasePart.Touched|Touched etkinliği, bir BasePart ile başka bir yüze veya bir arazi voxel ile temas ettiğinde ateşlenir. S
Aşağıdaki kod şeması, Touched etkinliğinin özelleştirilmiş bir onTouched() işlevine bağlanmasını gösterir. Etkinliğin, çarpışma içindeki diğer parçayı gösteren bir otherPart argümanını işaret eden bir işlev gösterdiğini unutmayın
Parça Çarpışması
local part = workspace.Part
local function onTouched(otherPart)
print(part.Name .. " collided with " .. otherPart.Name)
end
part.Touched:Connect(onTouched)
Aşağıdaki grafikte, Touched etkinliğinin çok sayıda kez hızlı bir şekilde başarılı olmasını sağlayan gizli fiziksel çarpışma gibi görünen bas
Parça Çarpışmasında Soğuma
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) -- Özelliği "Evet" olarak ayarla
task.wait(COOLDOWN_TIME) -- Soğuma süresini bekleyin
part:SetAttribute("Touched", false) -- Özelliği sıfırla
end
end
part.Touched:Connect(onTouched)
Dokunulmuş
Class.BasePart.TouchEnded|TouchEnded etkinliği, bir BasePart parçasının diğer bir BasePart
Aşağıdaki kod şeması, TouchEnded etkinliğinin özelleştirilmiş bir onTouchEnded() ile bağlanabilmesini gösterir. Tıpkı Touched gibi, etkinlik öbür tarafınızı gösteren bir
Çarpışma Algılaması Olmadan
local part = workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " is no longer touching " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)
Çarpışma Filtreleme
Çarpışma filtreleme iletişim kuran hangi fiziksel parçaların birbiriyle çarpıştığını tanımlar. Bazı nesnelerin filtrelenmesini Class.NoCollisionConstraint instansları aracılığıyla yapabilirsiniz veya bir Class.NoCollisionConstruct iletişim kutusu üzerinde bir çarpışma 4>parça-nereye-nereye4> üzer
Çarpışma Grupları
Çarpıştırma grupları size ait Class.BasePart|BaseParts 'i özel gruplara atmayı veya çarpıştığından başka gruplarla iletişim kurup etkileşim kurmadığını belirtmeyi sağlar. Gruplar içindeki parçalar birbirleriyle tamamen geçerlidir, hatta her iki parç
Çarpışma gruplarını Studio'nun Çarpışma Grup Editori aracılığıyla kolayca ayarlayabilirsiniz, Çarpışma Gruplarının Etkinleştirilmesi düğmesine tıklayarak erişebilirsiniz.
Editör, sol veya sağ Studio tarafına dokunmayı tercih eden Liste Görüntüsü işleviyle çalışır veya daha geniş bir Masaüstü Görüntü ile dokunmayı tercih eder.
Grupları Kaydetme
Editör, ismi değiştirilemez veya silinemez bir Varsayılan çarpışma grubunu içerir. Tüm BaseParts otomatik olarak bu varsayılan gruba katılır, yani diğer gruplarda herhangi bir objeyle çarpışacaktır.
Yeni bir çarpışma grupoluşturmak için:
Editör panelinin üstündeki Grup Ekle düğmesine tıklayın, yeni bir grup ismi girin ve Enter'e basın. Yeni grup her iki liste görüntüsündeki iki sütun veya her iki sütundan da görüntülenir.
Gerekirse işlemi tekrarlayın, her grupbenzersiz ve açıklayıcı bir isim seçmesini. grupisimlerini geliştirme sırasında alanına tıklayarak veya seçerek ve yeniden adlandır düğmesine tıklayarak değiştirebilirsiniz.
Grup Çarpıştırmalarını Yapılandırma
Varsayılan yapılandırmada, tüm gruplardaki nesneler birbirleriyle çarpışır. Bir grup içindeki nesnelerin bir grup içindeki nesnelerle çarpışmasını önlemek için, kutuyu ilgili sıralama/kolon içindeki kutusunun içine kontrol etmeyi etkinleştirin.
Aşağıdaki örnekte, Küpler grubundaki nesneler Doors grupnesnelerle çarpışmayacak.
Gruplara Objeleri Atama
Studio editöründen katılmış olduğunuz gruplara nesneleri atamak için:
Çarpışma grupbir parçası olarak kabul edilen bir veya daha fazla BaseParts seçin.
Onları sıraya ayarlamak için ⊕ düğmesine tıklayınız. Bir nesneyi yeni bir gruba yerleştirmek, onları mevcut grubundan ayrı yerleştirir, bu yüzden onları yeni bir gruba yerleştirmeniz onları mevcut grupayrı yerleştirir.
Etkilendiğinde, yeni grubun CollisionGroup özelliğinin altında yansıtılır.
StudioSelectable Çarpışma Grubu
Stüdyo'daki araçlar çarpışma filtreleme sistemini kullanır para 3D görüntüportöründe tıklanırken seçim için kullanıcılar için hangi nesnelerin seçim için kullanıcılar için kullanıcılar için kullanıcılar için kullanıcılar için kullanıcılar için kullanıcılar için kullanıcılar için kullanıcılar için kullanıcılar için k
Örneğin, büyük şeffaf parçalar tarafından etkili alanları tanımlanan bir yarış deneyiminde checkpoint'leri varsa, onlara bir Checkpoint çarpışma grubuna atayabilir ve ardından StudioSelectable ile etkili alanlarının yolunu açmasını sağlayarak onları yolsuz yapmazsınız.
For plugin kod, it's recommended that youassign "StudioSelectable" as the collision group filter of your RaycastParams when finding parts under the cursor. This allows your plugins to match the selection mechanisms that creators have learned to expect from built-in Studio tools.
Tavsiye Edilen Eklentiler Seçme Raycast
local UserInputService = game:GetService("UserInputService")local raycastParams = RaycastParams.new()raycastParams.CollisionGroup = "StudioSelectable" -- Konvansiyonu takip etmekraycastParams.BruteForceAllSlow = true -- Yani "yanlış" CanQuery ile bir parça seçilebilirlocal mouseLocation = UserInputService:GetMouseLocation()local mouseRay = workspace.CurrentCamera:ViewportPointToRay(mouseLocation.X, mouseLocation.Y)local filteredSelectionHit = workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 10000, raycastParams)
Parça-parça Filtreleme
çarpışma grupları oluşturmak olmadan iki özel parçanın çarpışmasını önlemek için, örneğin bir arabanın tekeresine ve onun şasi ile, Çarpışma Yok kısıtlamasını dikkate alın. Avantajları şunları içerir:
- Çarpışma grupları ve/veya yapılandırma kayıtları gerekli değildir, böylece özelleştirilmiş çarpışma filtrelemeyle kolayca model oluşturabilir ve paylaşabilirsiniz.
- Bağlantılı parçalar birbirleriyle çarpışmaz, ancak başka nesnelerle çarpışabilirler.
Karakter Çarpıştırmalarını Devre dışı Bırakma
Roblox oyuncu karakterleri varsayılan olarak birbirleriyle çarpışır. Bu, karakterlerin birbirlerine zirve atlaması gibi ilginç ama niyetli olmayan oynanışa yol açabilir. Bu davranış istemediğinizde, bunu önlemek için ServerScriptService ile bir Class.ServerScriptService arasındaki şu 2>Roblox oyun
Kod - Karakter Çarpıştırmalarını Devre dışı bırakma
local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
PhysicsService:RegisterCollisionGroup("Characters")
PhysicsService:CollisionGroupSetCollidable("Characters", "Characters", false)
local function onDescendantAdded(descendant)
-- Herhangi bir aşağıdaki parçadaki çarpışma grubunu ayarla
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Characters"
end
end
local function onCharacterAdded(character)
-- Fiziksel ayarlar için mevcut ve yeni soyundanları işle
for _, descendant in character:GetDescendants() do
onDescendantAdded(descendant)
end
character.DescendantAdded:Connect(onDescendantAdded)
end
Players.PlayerAdded:Connect(function(player)
-- oyuncukarakteri eklendiğinde algılayın
player.CharacterAdded:Connect(onCharacterAdded)
end)
Modeller Çarpıştırılabilir
Model nesneler, BasePart'den miras almak yerine parçalara konteynerlerdir, bu yüzden onlar doğrudan Class.BasePart.T
Aşağıdaki kod örneği, bir çok parçalı modelin tüm BaseParts 'lerine bağlanır ve çarpışma olayları ve diğer parçalar ile toplam çarpışma sayısını izleyin.
Modeller Çarpıştırılması
local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- Modelin kendisiyle çakıştığı anları görmezden gel
if otherPart:IsDescendantOf(model) then return end
-- Modellerin dokunan parçaların sayısını artır
numTouchingParts += 1
print(model.Name, "intersected with", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- Modelin kendisiyle çarpışmayan örneklerini görmezden gel
if otherPart:IsDescendantOf(model) then return end
-- Modellerin dokunan parçaların sayısını azalt
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
Mesh ve Solid Model Çarpışması
MeshPart ve PartOperation (geometriyi oluşturan solide parçaların birleşmesiyle
Class.TriangleMeshPart.CollisionFidelity|CollisionFidelity özelliğinin en düşük düzeyde düzenlenmiş olup en yüksek düzeyde etki alanı olan seçenekleri şu şekilde sıralanır:
- Kutu — Küçük veya etkileşimli olmayan nesneler için ideal olan çarpışma kutusu oluşturur.
- Hull — Daha az belirgili boşlukları veya kabarcıkları olan nesneler için uygun bir küre oluşturur.
- Varsayılan — Kırılma olasılığını destekleyen yaklaşık bir çarpışma şekli oluşturur, karmaşık nesnelerin yarı ayrıntılı etkileşim gereksinimlerine uygun.
- PreciseConvexDecomposition — En doğru sadelik sunar, ancak hala bir görselin 1:1 temsilini değil. Bu seçenek en pahalı performans ücretini içerir ve motorun hesaplanması daha uzun sürer.
Çarpışma kaynağı güvenliği seçeneklerinin performans etkisinde daha fazla bilgi için Performans Optimizasyonu bakın. Doğrudan görüntülenen performans gereksinimleriniz ve performans gereksinimlerinizi dengelenmesi için nasıl seçim yapacağınız konusunda ileride daha fazla bilgi için buraya bakın.