DragDetector örneği, bir oyundaki 3D nesnelerle etkileşimi kolaylaştırır ve teşvik eder; örneğin kapıları ve çekmeceleri açmak, bir parçayı kaydırmak, bir bowling topunu yakalamak ve fırlatmak, bir sapanı geri çekmek ve ateşlemek ve daha fazlası. Ana özellikler şunlardır:
Herhangi bir BasePart veya Model altına bir DragDetector yerleştirerek, sürüklenebilir hale getirebilirsiniz; bu, tüm girişlerle (fare, dokunma, oyun kumandası ve VR) yapılır ve tek bir kod satırı gerektirmez.
Birkaç sürükleme stili arasından seçim yapın, nesnenin harekete nasıl tepki verdiğini tanımlayın ve isteğe bağlı olarak ekseni veya hareket sınırlarını uygulayın.
Betikler, sürüklenen nesnelerin manipülasyonuna yanıt verebilir, böylece UI'yi yönlendirebilir veya bir odadaki ışık seviyesini bir kaydırmalı duvar anahtarı dimmerine göre ayarlamak gibi mantıksal kararlar alabilir.
Oyuncular, sabit parçaları veya modelleri manipüle edebilir ve bunlar bırakıldığında tam olarak yerinde kalır.
DragDetectors, Seç, Taşı, Ölçek veya Döndür araçlarını kullanmadığınız sürece Studio'da çalışır; bu, düzenleme sırasında sürüklenebilir nesneleri test etmeyi ve ayarlamayı kolaylaştırır.
Nesneleri sürüklenebilir hale getirme
Herhangi bir parça veya modeli sürüklenebilir hale getirmek için, doğrudan bir alt öğe olarak bir DragDetector ekleyin.
Menüyü açın ve bir DragDetector ekleyin.

Varsayılan olarak, nesne artık yer düzleminde sürüklenebilir olacak, ancak DragStyle'ını özelleştirebilir, nesnenin harekete nasıl tepki verdiğini tanımlayabilir ve isteğe bağlı olarak ekseni veya hareket sınırlarını uygulayabilirsiniz.
Sürükleyici dedektörleri özelleştirme
Sürükleme stili
DragDetectors, imleç hareketini sanal çizgilere ve düzlemlere eşleyerek önerilen 3D hareketi hesaplar. DragStyle özelliği aracılığıyla, ihtiyaçlarınıza uygun farklı eşlemeler arasından seçim yapabilirsiniz. Örneğin, TranslatePlane sanal bir düzlemde çeviri üretirken, RotateAxis sanal bir eksen etrafında döndürme üretir.
| Ayar | Açıklama |
|---|---|
| TranslateLine | Dedektörün Axis'i boyunca 1D hareket, varsayılan olarak dünya Y ekseni. |
| TranslatePlane | Dedektörün Axis'ine dik düzlemde 2D hareket, varsayılan olarak dünya XZ düzlemi. |
| TranslatePlaneOrLine | Dedektörün Axis'ine dik düzlemde 2D hareket ve modifikatör aktif olduğunda, dedektörün Axis'i boyunca 1D hareket. |
| TranslateLineOrPlane | Dedektörün Axis'i boyunca 1D hareket ve modifikatör aktif olduğunda, dedektörün Axis'ine dik düzlemde 2D hareket. |
| TranslateViewPlane | Kameranın görünümüne dik düzlemde 2D hareket. Bu modda, düzlem sürekli güncellenir, sürükleme sırasında bile, ve her zaman kameranın mevcut görünümüne bakar. |
| RotateAxis | Dedektörün Axis'i etrafında döndürme, varsayılan olarak dünya Y ekseni. |
| RotateTrackball | Trackball döndürmesi, TrackballRadialPullFactor ve TrackballRollFactor özellikleri aracılığıyla daha fazla özelleştirilir. |
| BestForDevice | Fare ve oyun kumandası için TranslatePlaneOrLine; dokunma için TranslatePlane; VR için 6DOF. |
| Scriptable | İstenilen hareketi SetDragStyleFunction() aracılığıyla sağlanan özel bir işlevle hesaplar. |
Sürükleme yönü
Varsayılan olarak, 3D hareket ve ilişkili DragStyle dünya alanına eşlenir. Ancak, ReferenceInstance, Orientation veya Axis'i değiştirmek isteyebilirsiniz; örneğin, ayarlanabilir parçalara sahip modellerin içine sürükleyici dedektörler yerleştirirken.
| Özellik | Açıklama | Varsayılan |
|---|---|---|
| ReferenceInstance | Sürükleyici dedektör için referans çerçevesi sağlayan bir örnek. DragFrame, bu referans çerçevesine göre ifade edilir ve GetReferenceFrame() aracılığıyla alınabilir. Referans çerçevesi nil ise, çeviri Axis özelliği yönünde (veya ona dik düzlemde) dünya alanında olacaktır. | nil |
| Orientation | Hareket eksenlerinin referans çerçevesine göre YXZ döndürmesini belirtir (referans çerçevesinin kendisinin yönünü değiştirmez). Doğrusal çeviri ve eksenel döndürme bu yeniden yönlendirilmiş Y ekseninde, düzlemsel çeviri ise XZ düzleminde olacaktır. Bu değeri değiştirmek, otomatik olarak Axis'i günceller ve tersine. | (0, 0, 0) |
| Axis | Hareketin ana ekseni, referans çerçevesine göre ifade edilir. Bu değeri değiştirmek, otomatik olarak Orientation'ı günceller ve tersine. | (0, 1, 0) |
Hareket tepkisi
ResponseStyle özelliği, bir nesnenin önerilen harekete nasıl tepki vereceğini belirtir; bu, nesnenin Anchored olup olmamasına bağlıdır.
| Ayar | Sabit davranış | Sabit olmayan davranış |
|---|---|---|
| Geometric | Hem çalıştırılan oyunda hem de Studio düzenleme modunda, sabit bir nesnenin konumu/yönü, önerilen hareketi tam olarak yansıtacak şekilde güncellenecektir. | Sabit olmayan bir nesne için, davranış sabit bir nesne ile aynı olacaktır. Ancak, çalıştırılan oyunda, nesne sürüklemenin başlangıcında sabitlenecek ve sürükleme bırakıldığında sabit olmayan hale getirilecektir. |
| Physical | Sabit bir nesne varsayılan olarak Geometrik davranış sergileyecektir, çünkü kuvvetlerden etkilenmez. | Sabit olmayan bir nesne, önerilen harekete göre istenen konuma ve/veya yöne getirmeye çalışan kısıtlama kuvvetleri tarafından hareket ettirilecektir. |
| Custom | Nesne hiç hareket etmeyecek, ancak DragFrame yine de güncellenecek ve sürükleme manipülasyonuna istediğiniz gibi yanıt verebilirsiniz. | (sabit olanla aynı) |
Eksen ve hareket sınırları
Varsayılan olarak, DragStyle'ın doğasında var olan kısıtlamalar dışında 3D harekete hiçbir sınır yoktur. Gerekirse, hem çeviri hem de döndürme için minimum ve maksimum sınırlar uygulayabilirsiniz. Ancak, bunların kısıtlama olmadığını; yalnızca sınırlar içinde kalmak için hareket dedektörünün hareket üretme çabalarını engellediğini unutmayın.
| Özellikler | Açıklama | Varsayılan |
|---|---|---|
| MinDragTranslation MaxDragTranslation | Her bir boyutta sürükleme çevirisini sınırlar. MaxDragTranslation, MinDragTranslation'dan büyükse, çeviri bu aralık içinde sınırlanacaktır. | (0, 0, 0) |
| MinDragAngle MaxDragAngle | Yalnızca DragStyle RotateAxis olarak ayarlandığında geçerlidir. Eğer MaxDragAngle, MinDragAngle'dan büyükse, döndürme bu aralık içinde sınırlanacaktır. | 0 |
Sürükleme izinleri
Bir oyuncunun belirli bir sürükleyici dedektör örneği ile etkileşim kurma izni, PermissionPolicy özelliği ile belirtilebilir. Bu varsayılan olarak Enum.DragDetectorPermissionPolicy.Everybody olarak ayarlanmıştır ve kod örneğinde gösterildiği gibi, betik izin kontrollerini desteklemek için değiştirilebilir.
| Ayar | Açıklama |
|---|---|
| Nobody | Hiçbir oyuncu DragDetector ile etkileşim kuramaz. |
| Everybody | Tüm oyuncular DragDetector ile etkileşim kurabilir. |
| Scriptable | Oyuncuların sürükleme izinleri, SetPermissionPolicyFunction() aracılığıyla kaydedilen bir işlevle belirlenecektir. Bu ayar altında, bir işlev kaydetmeme veya geçersiz bir sonuç döndürme durumu, tüm oyuncuların sürüklemesini engelleyecektir. |
local dragDetector = script.Parent.DragDetector
dragDetector.PermissionPolicy = Enum.DragDetectorPermissionPolicy.Scriptable
dragDetector:SetPermissionPolicyFunction(function(player, part)
if player and player:GetAttribute("IsInTurn") then
return true
elseif part and not part:GetAttribute("IsDraggable") then
return false
else
return true
end
end)Fizik tepkisi
Bir sürükleyicinin tepki stilinin Fiziksel olarak ayarlandığını ve sabit olmayan bir nesneye uygulandığını varsayarsak, o nesne, önerilen harekete göre verilen konuma/yöne getirmeye çalışan kısıtlama kuvvetleri tarafından hareket ettirilecektir. Fiziksel tepkiyi aşağıdaki özellikler aracılığıyla daha da özelleştirebilirsiniz:
| Özellik | Açıklama | Varsayılan |
|---|---|---|
| ApplyAtCenterOfMass | Yanlış olduğunda, sürükleme kuvveti kullanıcının tıkladığı noktada uygulanır. Doğru olduğunda, kuvvet nesnenin kütle merkezinde uygulanır. | yanlış |
| MaxForce | Nesnenin hedefine ulaşması için uygulanan maksimum kuvvet. | 10000000 |
| MaxTorque | Nesnenin hedefine ulaşması için uygulanan maksimum tork. | 10000 |
| Responsiveness | Daha yüksek değerler, nesnenin hedefine daha hızlı ulaşmasını sağlar. | 10 |
Modifikatör girişi
Bazı DragStyle modları, kullanıcıların sürüklenen nesneyi farklı şekillerde manipüle etmek için bir modifikatör tuşuna/butonuna basılı tutmalarına izin verir. Varsayılan olarak, modifikatör PC'de LeftControl, oyun kumandasında ButtonR1 veya VR'da ButtonL2'dir. Bu modifikatörleri, sürükleyici dedektör örneğinin KeyboardModeSwitchKeyCode, GamepadModeSwitchKeyCode veya VRSwitchKeyCode özellikleri aracılığıyla özelleştirebilirsiniz.
Çoğaltma
RunLocally özelliği yanlış (varsayılan) olduğunda, istemci tüm girişi yorumlayarak sunucuya sürüklemeyi gerçekleştirmek için veri gönderir. Bu modda, tüm özel olay sinyalleri ve kaydedilmiş işlevler sunucu Scripts içinde olmalıdır.
RunLocally özelliği doğru olduğunda, hiçbir olay sunucuya çoğaltılmaz. Tüm özel olay sinyalleri ve kaydedilmiş işlevler istemci LocalScripts içinde olmalıdır ve gerekli değişiklikleri sunucuya iletmek için uzaktan olaylar kullanmalısınız.
Tıklama ve sürükleme için betik yanıtları
Olay sinyalleri, özellik değişiklikleri, Scriptable sürükleme stili ve özel işlevler aracılığıyla, betikler sürüklenen nesnelerin manipülasyonuna yanıt verebilir; böylece UI'yi yönlendirebilir veya bir odadaki ışık seviyesini bir kaydırmalı duvar anahtarı dimmerine göre ayarlamak gibi mantıksal kararlar alabilir.
Olay sinyalleri
Aşağıdaki olay sinyalleri aracılığıyla, bir kullanıcının bir nesneyi sürüklemeye başladığında, devam ettiğinde ve durdurduğunda tespit edebilirsiniz.
| Olay | Açıklama |
|---|---|
| DragStart | Bir kullanıcının nesneyi sürüklemeye başladığında tetiklenir. |
| DragContinue | Bir kullanıcı DragStart başlatıldıktan sonra nesneyi sürüklemeye devam ettiğinde tetiklenir. |
| DragEnd | Bir kullanıcı nesneyi sürüklemeyi durdurduğunda tetiklenir. |
local dragDetector = script.Parent.DragDetector
local highlight = Instance.new("Highlight")
highlight.Enabled = false
highlight.Parent = script.Parent
dragDetector.DragStart:Connect(function()
highlight.Enabled = true
end)
dragDetector.DragContinue:Connect(function()
end)
dragDetector.DragEnd:Connect(function()
highlight.Enabled = false
end)Sürükleme çerçevesi değişiklikleri
Olay sinyalleri dışında, dedektörün DragFrame'inde doğrudan değişiklikleri izleyebilirsiniz.
local dragDetector = script.Parent.DragDetector
dragDetector:GetPropertyChangedSignal("DragFrame"):Connect(function()
local currentDragTranslation = dragDetector.DragFrame.Position
print(currentDragTranslation)
end)Betik sürükleme stili
Bir dedektörün DragStyle'ını Scriptable olarak ayarlarsanız, bir Ray alanı alan ve dünya alanında bir CFrame döndüren kendi işlevinizi sağlayabilirsiniz. Dedektör, sürüklenen nesnenin o özel konuma/yöne gitmesi için hareketi bu şekilde yönlendirecektir.
local Workspace = game:GetService("Workspace")
local dragDetector = script.Parent.DragDetector
dragDetector.DragStyle = Enum.DragDetectorDragStyle.Scriptable
local cachedHitPoint = Vector3.zero
local cachedHitNormal = Vector3.yAxis
local function followTheCursor(cursorRay)
-- Sürüklenen nesneyi ışın izleme tespitinden hariç tut
local raycastParams = RaycastParams.new()
raycastParams.FilterDescendantsInstances = {dragDetector.Parent}
raycastParams.FilterType = Enum.RaycastFilterType.Exclude
local hitPoint = Vector3.zero
local hitNormal = Vector3.yAxis
local raycastResult = Workspace:Raycast(cursorRay.Origin, cursorRay.Direction, raycastParams)
if raycastResult then
hitPoint = raycastResult.Position
hitNormal = raycastResult.Normal.Unit
else
hitPoint = cachedHitPoint
hitNormal = cachedHitNormal
end
cachedHitPoint = hitPoint
cachedHitNormal = hitNormal
local lookDir1 = hitNormal:Cross(Vector3.xAxis)
local lookDir2 = hitNormal:Cross(Vector3.yAxis)
local lookDir = if lookDir1.Magnitude > lookDir2.Magnitude then lookDir1.Unit else lookDir2.Unit
return CFrame.lookAt(hitPoint, hitPoint + lookDir, hitNormal)
end
dragDetector:SetDragStyleFunction(followTheCursor)Özel kısıtlama işlevi
Sürükleyici dedektörler, ızgara ve yapışma hakkında yerleşik hareket kurallarına sahip değildir, ancak dedektörün DragFrame'ini uygulanmadan önce düzenlemek için özel kısıtlama işlevleri kaydedebilirsiniz. Örneğin, pozisyonları ızgara artışlarının katlarına yuvarlayarak hareketi bir ızgarada tutabilir veya her parçanın yasal hareket kurallarına göre bir satranç oyunu simüle edebilirsiniz.
local dragDetector = script.Parent.DragDetector
local startPartPosition = nil
local SNAP_INCREMENT = 4
dragDetector.DragStart:Connect(function()
startPartPosition = script.Parent.Position
end)
dragDetector.DragEnd:Connect(function()
startPartPosition = nil
end)
local function snapToWorldGrid(proposedMotion)
if startPartPosition == nil then
return proposedMotion
end
local snapIncrement = SNAP_INCREMENT // 1
if snapIncrement < 1 then
return proposedMotion
end
local newWorldPosition = startPartPosition + proposedMotion.Position
local roundedX = ((newWorldPosition.X / snapIncrement + 0.5) // 1) * snapIncrement
local roundedY = ((newWorldPosition.Y / snapIncrement + 0.5) // 1) * snapIncrement
local roundedZ = ((newWorldPosition.Z / snapIncrement + 0.5) // 1) * snapIncrement
local newRoundedWorldPosition = Vector3.new(roundedX, roundedY, roundedZ)
return proposedMotion.Rotation + (newRoundedWorldPosition - startPartPosition)
end
local connection = dragDetector:AddConstraintFunction(2, snapToWorldGrid)
-- Uygun olduğunda, kısıtlama işlevini kaldırmak için connection:Disconnect() çağrısını yapınÖrnek kullanım
Sabit olmayan fiziksel nesneler
Sürükleyici dedektörlerin temel bir uygulaması, oyuncuların dikkatlice parçaları çıkarması ve kulesi dik tutmaya çalışması gereken bir kule denge oyunudur. Aşağıdaki kule yapısında, her parça, oyuncuların parçaları dışarı çekmesine izin veren varsayılan DragStyle TranslatePlane olan bir alt DragDetector içerir, ancak yukarı veya aşağı çekmelerine izin verilmez.
Ayarlanabilir parçalara sahip sabit modeller
Temelde sabit olan, ancak oyuncuların sürükleyebileceği bir veya daha fazla alt parça/model içeren modeller oluşturmak ve paylaşmak oldukça kolaydır. Örneğin, aşağıdaki masa, oyuncuların içindekileri incelemek için açabileceği iki çekmeceye sahiptir.
Sürükleyici dedektörler ve kısıtlamalar
Sürükleyici dedektörleri, örneğin bir kukla ile Constraints ile birleştirebilirsiniz. Aşağıdaki kurulumda, kontrol kolları sabit, gövde parçaları sabit olmayan ve kısıtlamalar kuklayı bir arada tutar. TranslateViewPlane DragStyle ile kolları hareket ettirmek kuklayı dans ettirir ve bireysel gövde parçaları da sürükleyici dedektörlerle hareket ettirilebilir; tüm bunlar modelin bütünlüğünü korurken gerçekleşir.
3D kullanıcı arayüzleri
3D kullanıcı arayüzleri, bir SpotLight'ın parlaklığını bir kaydırmalı anahtar dimmerine göre ayarlamak gibi sürükleyici dedektörler aracılığıyla kolayca elde edilebilir. Ayrıca, iki farklı 3D kullanıcı arayüzü yönünü kontrol etmek için X ve Z eksenlerini ayrı ayrı tespit edebilirsiniz; örneğin, bir ParticleEmitter'ın Size, Speed ve Color'sını kontrol edebilirsiniz.
local model = script.Parent
local slider = model.SliderPart
local originPart = model.OriginPart
local emitter = script.Parent.EmitterPart.ParticleEmitter
local dragDetector = slider.DragDetector
dragDetector.ReferenceInstance = originPart
dragDetector.MinDragTranslation = Vector3.zero
dragDetector.MaxDragTranslation = Vector3.new(10, 0, 10)
local dragRangeX = dragDetector.MaxDragTranslation.X - dragDetector.MinDragTranslation.X
local dragRangeZ = dragDetector.MaxDragTranslation.Z - dragDetector.MinDragTranslation.Z
local MIN_PARTICLE_SIZE = 1
local MAX_PARTICLE_SIZE = 1.5
local MIN_PARTICLE_SPEED = 2.5
local MAX_PARTICLE_SPEED = 5
local COLOR1 = Color3.fromRGB(255, 150, 0)
local COLOR2 = Color3.fromRGB(255, 0, 50)
local function updateParticles(emitter)
local dragFactorX = (dragDetector.DragFrame.Position.X - dragDetector.MinDragTranslation.X) / dragRangeX
local dragFactorZ = (dragDetector.DragFrame.Position.Z - dragDetector.MinDragTranslation.Z) / dragRangeZ
-- Sürükleyici dedektör X faktörüne göre parçacık boyutunu ve hızını ayarlayın
emitter.Size = NumberSequence.new{
NumberSequenceKeypoint.new(0, 0),
NumberSequenceKeypoint.new(0.1, MIN_PARTICLE_SIZE + ((MAX_PARTICLE_SIZE - MIN_PARTICLE_SIZE) * dragFactorX)),
NumberSequenceKeypoint.new(1, 0)
}
local speed = MIN_PARTICLE_SPEED + ((MAX_PARTICLE_SPEED - MIN_PARTICLE_SPEED) * dragFactorX)
emitter.Speed = NumberRange.new(speed, speed * 1.2)
-- Sürükleyici dedektör Z faktörüne göre parçacık rengini ayarlayın
local color = COLOR2:Lerp(COLOR1, dragFactorZ)
emitter.Color = ColorSequence.new{
ColorSequenceKeypoint.new(0, color),
ColorSequenceKeypoint.new(1, color)
}
end
dragDetector:GetPropertyChangedSignal("DragFrame"):Connect(function()
updateParticles(emitter)
end)