Çarpışma

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

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ç

Yukarıdaki video içinde, dönen nesneler farklı çarpışma gruplarında bulunur, böylece diğer renkli nesnelerle çarpışır, ancak kendi renkleriyle ilgili olmayan nesnelerle çarpışmaz

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

Collision Groups tool indicated in Model tab of Studio

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.

List View example in Collision Groups Editor

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:

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

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

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

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.

Group configured in List View of Collision Groups Editor

Gruplara Objeleri Atama

Studio editöründen katılmış olduğunuz gruplara nesneleri atamak için:

  1. Çarpışma grupbir parçası olarak kabul edilen bir veya daha fazla BaseParts seçin.

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

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

Etkilendiğinde, yeni grubun CollisionGroup özelliğinin altında yansıtılır.

Chosen collision group indicated as the part's CollisionGroup property

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.

Checkpoints group configured to be non-collidable with StudioSelectable group

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 etmek
raycastParams.BruteForceAllSlow = true -- Yani "yanlış" CanQuery ile bir parça seçilebilir
local 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.
Original mesh of castle tower

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