DragDetector örneği, kapıları ve çekmeceleri açmak, bir parçayı sürüklemek, bir bowling topunu yakalamak ve fırlatmak, bir lastik fırlatıcı ile geriye çekmek ve ateşlemek gibi, bir deneyimde 3D nesnelerle etkileşimi kolaylaştırır ve teşvik eder. Ana özellikler arasında şunlar bulunur:
DragDetector'ı, tüm girdilerle (fare, dokunma, gamepad ve VR) sürüklenebilir hale getirmek için herhangi bir BasePart veya Model'ın altına yerleştirin; tüm bunlar tek bir satır kod yazmadan.
Çeşitli sürükleme stillerinden seçin, nesnenin nasıl harekete yanıt verdiğini tanımlayın ve isteğe bağlı olarak ekseni veya hareket sınırlarını uygulayın.
Scriptler, sürüklenen nesnelerin manipülasyonuna yanıt verebilir ve UI'yi yönlendirmek veya mantıksal kararlar almak amacıyla, örneğin bir kaydırma duvar anahtarının koyu seviyesini ayarlamak gibi.
Oyuncular, sabitlenmiş parçaları veya modelleri manipüle edebilir ve bıraktıklarında tam olarak yerinde kalır.
DragDetectors Studio'da yalnızca Seç, Taşın, Ölçek, veya Döndür araçlarını kullanmadığınızda çalışır, böylece düzenleme sırasında sürüklenebilir nesneleri test etmek ve ayarlamak daha kolaydır.
Nesneleri sürüklenebilir hale getirme
Herhangi bir parçayı veya modeli sürüklenebilir hale getirmek için, doğrudan bir DragDetector eklemeniz yeterlidir.
Menüden bir DragDetector ekleyin.

Varsayılan olarak, nesne artık zemin düzleminde sürüklenebilir hale gelecektir ancak DragStyle'ını özelleştirebilir, nasıl harekete yanıt 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 3B hareketi hesaplar. DragStyle özelliği aracılığıyla, ihtiyaçlarınıza uygun farklı eşlemelerden 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 öğesi boyunca 1D hareket, varsayılan olarak dünya Y ekseni boyunca. |
| TranslatePlane | Dedektörün Axis öğesine dik düzlemde 2D hareket, varsayılan olarak dünya XZ düzlemi. |
| TranslatePlaneOrLine | Dedektörün Axis öğesine dik düzlemde 2D hareket ve modifikatör aktifken, dedektörün Axis öğesi boyunca 1D hareket. |
| TranslateLineOrPlane | Dedektörün Axis öğesi boyunca 1D hareket ve modifikatör aktifken, dedektörün Axis öğesine 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 ve sürüklerken kameranın mevcut görünümüne her zaman dönük olur. |
| RotateAxis | Dedektörün Axis öğesi etrafında döndürme, varsayılan olarak dünya Y ekseni. |
| RotateTrackball | Trackball döndürmesi, TrackballRadialPullFactor ve TrackballRollFactor özellikleri ile daha fazla özelleştirilir. |
| BestForDevice | Fare ve gamepad için TranslatePlaneOrLine; dokunma için TranslatePlane; VR için 6DOF. |
| Scriptable | İstenilen hareketi, SetDragStyleFunction() aracılığıyla sağlanan özel bir fonksiyonla hesaplar. |
Sürükleme yönü
Varsayılan olarak, 3D hareket ve ilişkili DragStyle dünya alanına eşlenir. Ancak, örneğin ayarlanabilir parçalara sahip modeller inşa ederken ReferenceInstance, Orientation veya Axis'ı değiştirmek isteyebilirsiniz.
| Özellik | Açıklama | Varsayılan |
|---|---|---|
| ReferenceInstance | Pivotu, 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() ile alınabilir. Referans çerçevesi nil ise, çeviri dünya alanında Axis özelliğinin yönünde (veya ona dik düzlemde) yapılacaktı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 olacaktır ve düzlemsel çeviri XZ düzleminde olacaktır. Bu değeri değiştirmek, otomatik olarak Axis'ı günceller ve tam tersini de yapar. | (0, 0, 0) |
| Axis | Referans çerçevesine göre ifade edilen ana hareket ekseni. Bu değeri değiştirmek, otomatik olarak Orientation'ı günceller ve tam tersini de yapar. | (0, 1, 0) |
Hareket yanıtı
ResponseStyle özelliği, bir nesnenin önerilen harekete nasıl yanıt verdiğini belirler; nesne Anchored mı yoksa değil mi.
| Ayar | Sabitlenmiş davranış | Sabitlenmemiş davranış |
|---|---|---|
| Geometric | Hem çalışmakta olan deneyimde hem de Studio düzenleme modunda, sabitlenmiş bir nesnenin konumu/yönelimi, önerilen harekete tam olarak yansıtılacak şekilde güncellenecektir. | Bir sabitlenmemiş nesne için, davranış sabitlenmiş nesne ile aynı olacaktır. Ancak, çalışan bir deneyimde, nesne sürükleme başlangıcında sabitlenecek ve sürükleme serbest bırakıldığında sabitlenmemiş olarak geri dönecektir. |
| Physical | Sabitlenmiş bir nesne, kuvvetlerden etkilenmediği için varsayılan olarak Geometric davranışına sahip olacaktır. | Sabitlenmemiş bir nesne, önerilen harekete verilen istenen konum ve/veya yönelimi sağlamak için kısıtlama kuvvetleri tarafından taşınacaktır. |
| Custom | Nesne hiç hareket etmeyecek, ancak DragFrame hala güncellenebilir ve istediğiniz gibi sürükleme manipülasyonuna yanıt verebilirsiniz. | (sabitlenmiş ile aynı) |
Eksen ve hareket sınırları
Varsayılan olarak, DragStyle'ın doğasında bulunan kısıtlamalar dışında 3D hareket için herhangi bir kısıtlama 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ürükleyici dedektörün sınırlar içinde kalmak için hareket üretme çabalarını sınırladığını unutmayın.
| Özellikler | Açıklama | Varsayılan |
|---|---|---|
| Her bir boyutta sürükleme çeviri sınırları. Eğer MaxDragTranslation, MinDragTranslation'dan büyükse, çeviri bu aralık içinde tutulur. | (0, 0, 0) | |
| 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 tutulur. | 0 |
Sürükleme izinleri
Oyuncuların belirli bir sürükleyici dedektör örneği ile etkileşime girme izni, PermissionPolicy özelliği aracılığıyla belirtilebilir. Varsayılan olarak Enum.DragDetectorPermissionPolicy.Everybody olarak ayarlanmıştır ve kod örneğinde gösterildiği gibi script ile izin kontrolünü destekleyecek şekilde değiştirilebilir.
| Ayar | Açıklama |
|---|---|
| Nobody | Hiçbir oyuncu DragDetector ile etkileşime giremez. |
| Everybody | Tüm oyuncular DragDetector ile etkileşime girebilir. |
| Scriptable | Oyuncuların sürükleme izinleri, SetPermissionPolicyFunction() aracılığıyla kaydedilen bir fonksiyon tarafından belirlenecektir. Bu ayar altında, bir fonksiyonu kaydetmeme veya geçersiz bir sonuç döndürme durumu tüm oyuncuların sürüklemesini engelleyecektir. |
DragDetector - Scriptlenebilir Sürükleme İzni
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 yanıtı
Eğer bir sürükleyicinin yanıt stili Fiziksel olarak ayarlandıysa ve sabitlenmemiş bir nesneye uygulanıyorsa, bu nesne önerilen harekete verilen konum/yönelimi elde etmek için kısıtlama kuvvetleri tarafından taşınacaktır. Fiziksel yanıtı aşağıdaki özellikler aracılığıyla daha da özelleştirebilirsiniz:
| Özellik | Açıklama | Varsayılan |
|---|---|---|
| ApplyAtCenterOfMass | Sahte 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. | false |
| MaxForce | Nesnenin hedefe ulaşması için uygulanan maksimum kuvvet. | 10000000 |
| MaxTorque | Nesnenin hedefe ulaşması için uygulanan maksimum tork. | 10000 |
| Responsiveness | Daha yüksek değerler, nesnenin hedefe 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şu/buttonunun basılı tutulmasına izin verir. Varsayılan olarak, modifikatör PC'de LeftControl, gamepad'de ButtonR1 ve VR'de ButtonL2'dir. Bu modifikatörleri, sürükleyici dedektör örneğinin KeyboardModeSwitchKeyCode, GamepadModeSwitchKeyCode veya VRSwitchKeyCode özellikleri aracılığıyla özelleştirebilirsiniz.
Replikasyon
RunLocally özelliği yanlış olduğunda (varsayılan), istemci tüm girişi yorumlayarak veriyi sunucuya gönderir, bu da sürüklemeyi gerçekleştirir. Bu modda, tüm özel olay sinyalleri ve kayıtlı fonksiyonlar sunucu Scripts içinde olmalıdır.
RunLocally özelliği doğru olduğunda, hiçbir olay sunucuya kopyalanmaz. Tüm özel olay sinyalleri ve kayıtlı fonksiyonlar istemci LocalScripts içinde olmalı ve gerekli değişiklikleri sunucuya iletmek için uzak olaylar kullanmalısınız.
Tıklama ve sürükleme için script yanıtları
Olay sinyalleri aracılığıyla, özellik değişiklikleri, Scriptable sürükleme tarzı ve özel fonksiyonlar, scriptler sürüklenen nesnelerin manipülasyonuna yanıt verebilir ve UI'yi yönlendirmek veya mantıksal kararlar almak için kullanılabilir; örneğin kaydırma duvar anahtarına göre bir odadaki ışık seviyesini ayarlamak gibi.
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 durduğunda algılayabilirsiniz.
| Olay | Açıklama |
|---|---|
| DragStart | Bir kullanıcı 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 bıraktığında tetiklenir. |
DragDetector - Olay Sinyalleri
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ındaki değişiklikleri doğrudan izleyebilirsiniz.
DragDetector - DragFrame Değişiklikleri
local dragDetector = script.Parent.DragDetector
dragDetector:GetPropertyChangedSignal("DragFrame"):Connect(function()
local currentDragTranslation = dragDetector.DragFrame.Position
print(currentDragTranslation)
end)
Scriptlenebilir sürükleme stili
Bir dedektörün DragStyle'ını Scriptable olarak ayarladığınızda, bir Ray alıp dünya alanında bir CFrame döndüren kendi fonksiyonunuzu sağlayabilirsiniz. Dedektör, sürüklenen nesnenin bu özel konum/yönelime gitmesini sağlayacak şekilde hareketi yönlendirecektir.
DragDetector - Scriptlenebilir Sürükleme Stili
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 raycast algılama dışında bırak
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 fonksiyonu
Sürükleyici dedektörler, ızgara ve yakalama ile ilgili yerleşik hareket kurallarına sahip değildir ancak dedektörün DragFrameını uygulanmadan önce düzenlemek için özel kısıtlama fonksiyonları kaydedebilirsiniz. Örneğin, pozisyonları ızgara artışlarının katlarına yuvarlayarak hareketi bir ızgarada tutabilir veya her parçanın hareket kurallarına uygun bir satranç oyunu simüle edebilirsiniz.
DragDetector - Özel Kısıtlama Fonksiyonu
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 fonksiyonunu kaldırmak için connection:Disconnect() çağrısını yapın
Örnek kullanım
Sabitlenmemiş fiziksel nesneler
Sürükleyici dedektörlerin temel bir uygulanışı, oyuncuların dikkatlice parçaları çıkarmaya çalışacağı ve kuleyi dik tutma çabası içinde olacağı bir kule dengeleme oyunudur. Aşağıdaki kule yapısında, her parçada varsayılan DragStyle olan TranslatePlane ile sürüklenebilir bir DragDetector çocuk olarak yer alır; böylece oyuncular parçaları dışarı çekebilir ancak yukarı veya aşağı süremezler.
Sabitlenmiş modeller ile ayarlanabilir parçalar
Özellikle sabitlenmiş olan modelleri daha fazla çocuk parça/model ile oluşturabilir ve paylaşabilirsiniz; oyuncular bu parçaları sürükleyebilir. Örneğin, aşağıdaki masa iki çekmeceden oluşur; oyuncular bunları açarak içini inceleyebilir.
Sürükleyici dedektörler ve kısıtlamalar
Sürükleyici dedektörleri Constraints ile birleştirebilirsiniz; örneğin, bir kukla marionet. Aşağıdaki kurulumda, kontrol sapları sabitlenmiş, vücut parçaları sabitlenmemiştir ve kısıtlamalar marioneti bir arada tutar. Sapları TranslateViewPlane DragStyle ile kaydırmak marionetin dans etmesini ve bireysel vücut parçalarının da sürükleyici dedektörler ile hareket etmesini sağlar; tüm bunlar modelin bütünlüğünü korurken olur.
3D kullanıcı arayüzleri
3D kullanıcı arayüzleri, bir SpotLight'ın parlaklığını kaydırma anahtarına göre ayarlamak gibi, sürükleyici dedektörler aracılığıyla kolayca elde edilebilir. Ayrıca, iki farklı 3D kullanıcı arayüzü alanını kontrol etmek için X ve Z eksenlerini ayrı ayrı algılayabilirsiniz; örneğin, bir ParticleEmitter'ın Size, Speed ve Color değerlerini kontrol etmek gibi.
DragDetector - 3D Kullanıcı Arayüzü
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ün 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ün 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)