UIDragDetector örneği, bir oyundaki 2D kullanıcı arayüzü öğeleriyle, kaydırıcılar, dönerler ve daha fazlası gibi etkileşimi kolaylaştırır ve teşvik eder. Anahtar özellikler şunlardır:
Herhangi bir GuiObject örneğinin altına bir UIDragDetector yerleştirerek, tek bir kod satırı yazmadan tüm kullanıcı girişleriyle sürüklenebilir hale getirin.
DragStyle seçeneklerinden birini seçin, nesnenin hareketle nasıl tepki vereceğini ResponseStyle ile tanımlayın ve isteğe bağlı olarak eksen, hareket sınırları veya sürükleme sınırları uygulayın.
Betikler, sürüklenen nesnelerin manipülasyonuna yanıt vererek, ayarları ayarlamak gibi mantıksal yanıtlar oluşturabilir.
UIDragDetectors, Seçim, Taşıma, Ölçekleme veya Döndürme araçlarını kullanmadığınız sürece, Studio'nun düzenleme ve oynatma modlarında çalışır, ayrıca belirli eklentiler veya Studio'nun UI düzenleyici araçları da kullanılmamalıdır.
UI öğelerini sürüklenebilir hale getirin
Herhangi bir GuiObject örneğini sürüklenebilir hale getirmek için, doğrudan bir UIDragDetector eklemeniz yeterlidir.
Menüyü kullanarak bir UIDragDetector ekleyin.

Varsayılan olarak, nesne artık LayerCollector arayüzünde sürüklenebilir olacaktır.
UI sürükleyici dedektörlerini özelleştirin
Sürükleme stili
UIDragDetectors, imleç hareketini 2D hareket ve/veya döndürme hesaplamak için eşleştirir. DragStyle özelliği aracılığıyla ihtiyaçlarınıza uygun farklı eşleştirmeler arasından seçim yapabilirsiniz. Örneğin, Enum.UIDragDetectorDragStyle.TranslatePlane, LayerCollector'ın 2D düzleminde çeviri üretirken, Enum.UIDragDetectorDragStyle.Rotate genellikle çeviri yerine bir döndürme üretir.
| Ayar | Açıklama |
|---|---|
| TranslateLine | Dedektörün DragAxis boyunca 1D hareket. |
| TranslatePlane | LayerCollector düzleminde 2D hareket. |
| Rotate | Varsayılan olarak, dedektörün ana GuiObject'ının mutlak merkez pozisyonu etrafında döner. Eğer ReferenceUIInstance ayarlanmışsa, döndürme o örneğin mutlak merkez pozisyonu etrafında gerçekleşir. |
| Scriptable | Özel bir işlev aracılığıyla istenen hareketi hesaplar, bu işlev SetDragStyleFunction() ile sağlanır. |
Sürükleme yönü
Varsayılan olarak, 2D hareket ve ilişkili DragStyle, ata LayerCollector'ın alanına eşleştirilir. Ancak, farklı UI bileşenleri oluştururken ReferenceUIInstance veya DragAxis'ı değiştirmek isteyebilirsiniz.
| Ayar | Açıklama | Varsayılan |
|---|---|---|
| ReferenceUIInstance | Dedektör için referans alanı ve başlangıç noktası olan bir GuiObject örneği. Bu referansın ayarlanması, DragUDim2, DragRotation gibi özellikleri ve DragAxis'ın davranışını etkiler. | nil |
| DragAxis | Vector2 değeri, DragStyle Enum.UIDragDetectorDragStyle.TranslateLine olarak ayarlandığında sürüklenen nesnenin hareket eksenini tanımlar. Eksen, UIDragDetector'ın yerel alanında tanımlanır, eğer ReferenceUIInstance tanımlanmışsa, o zaman eksen o örneğin yerel alanında tanımlanır. | (1, 0) |
Hareket tepkisi
UIDragDetector.ResponseStyle özelliği, bir nesnenin pozisyon değerinin önerilen hareketle nasıl değiştirileceğini belirtir. Özel yanıt stilleri, dedektörün ebeveyninin önerilen hareketi gerçekleştirmeden UIDragDetector.DragUDim2 ve UIDragDetector.DragRotation değerlerini istediğiniz gibi kullanmanıza olanak tanır.
| Ayar | Açıklama |
|---|---|
| Offset | Dedektörün ebeveyninin GuiObject.Position değerinin Offset değerleriyle hareket eder. Bu varsayılan ayardır. |
| Scale | Dedektörün ebeveyninin GuiObject.Position değerinin Scale değerleriyle hareket eder. |
| CustomOffset | UI öğesi hiç hareket etmeyecek, ancak dedektörün DragUDim2 değerlerinin Offset değerleri güncellenmeye devam edecek ve dedektörün olayları tetiklenecek, böylece sürükleme manipülasyonuna istediğiniz gibi yanıt verebilirsiniz. |
| CustomScale | UI öğesi hiç hareket etmeyecek, ancak dedektörün DragUDim2 değerlerinin Scale değerleri güncellenmeye devam edecek ve dedektörün olayları tetiklenecek, böylece sürükleme manipülasyonuna istediğiniz gibi yanıt verebilirsiniz. |
Çeviri ve döndürme sınırları
Varsayılan olarak, DragStyle'ın doğasında var olan kısıtlamalar dışında 2D hareket için herhangi bir sınır yoktur. İstenirse, minimum ve maksimum çeviriler ve döndürmeler için aşağıdaki özelliklerle sınırlar tanımlanabilir. Ayrıca, sürüklenen nesnenin belirli bir GuiObject (örneğin bir Frame) içinde nasıl kısıtlandığını tanımlayabilirsiniz.
| Özellikler | Açıklama | Varsayılan |
|---|---|---|
| MinDragTranslation MaxDragTranslation | Her bir boyutta sürükleme çevirisini sınırlayan, UDim2 değeriyle tanımlanır. Eğer MaxDragTranslation, MinDragTranslation'dan büyükse, çeviri o aralık içinde sınırlanır. | {0, 0}, {0, 0} |
| MinDragAngle MaxDragAngle | Yalnızca DragStyle Enum.UIDragDetectorDragStyle.Rotate olarak ayarlandığında veya SetDragStyleFunction() veya AddConstraintFunction() aracılığıyla ayarlanan işlevler bir döndürme değeri tanımladığında geçerlidir. Eğer MaxDragAngle, MinDragAngle'dan büyükse, döndürme o aralık içinde sınırlanır. | 0 |
| BoundingBehavior | Dedektörün BoundingUI ayarlandığında sınırlama davranışını belirler. Bunu EntireObject olarak ayarlamak, sürüklenen UI'nin tamamını BoundingUI içinde sınırlar, HitPoint olarak ayarlamak ise sürüklenen UI'yi yalnızca tam vurma/tutma noktasına ve çeviri/döndürme sonrası ilgili pozisyona göre sınırlar. Kolaylık olması açısından, Automatic varsayılanı, BoundingUI tarafından tamamen kapsanan bir UI nesnesi için EntireObject davranışını taklit eder, aksi takdirde BoundingUI'nin kısmen dışında kalan bir UI nesnesi için HitPoint davranışını taklit eder. | Automatic |
Hız ayarlamaları
SelectionModeDragSpeed ve SelectionModeRotateSpeed aracılığıyla, bir dedektör için maksimum sürükleme/döndürme hızlarını ince ayar yapabilirsiniz. Ayrıca, UIDragSpeedAxisMapping ile dedektörün SelectionModeDragSpeed değerine dayalı olarak X/Y boyutundaki sürükleme hızlarını ince ayar yapabilirsiniz.
| Özellik | Açıklama |
|---|---|
| SelectionModeDragSpeed | Dedektörün ait olduğu ilk ata ScreenGui veya SurfaceGui'nın Scale ve Offset kombinasyonu olarak çeviri için maksimum sürükleme hızını tanımlar. |
| SelectionModeRotateSpeed | UIDragDetector'ın dönebildiği maksimum açıyı saniye başına tanımlar. |
| UIDragSpeedAxisMapping | Dedektörün SelectionModeDragSpeed değerine dayalı olarak X/Y boyutundaki sürükleme hızlarını belirler. Varsayılan XY olup, bu da X ve Y eksen hızlarının sırasıyla X ve Y Scale/Offset değerlerine dayandığı anlamına gelir. Alternatifler XX ve YY olup, bu da X ve Y eksen hızlarının sırasıyla Scale için X (XX) veya Y (YY) eksenine dayandığı anlamına gelir, ancak Offset değerleri yine de kendi eksenlerine uygulanır. Örneğin, eğer ilk ata ScreenGui boyutu 800×600 ise ve SelectionModeDragSpeed değeri {0.1, 10}, {0.1, 20} ise, XX ayarı X/Y sürükleme hızını 80+10/80+20 yaparken, YY ayarı 60+10/60+20 yapar (not: Offset değerleri her iki durumda da aynı kalır). |
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 UI öğelerinin manipülasyonuna yanıt vererek çeşitli ayarları yönlendirebilir veya mantıksal kararlar alabilir, örneğin müzik ve ses efekti ses seviyelerini ayrı ayrı ayarlayan kaydırıcılar 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 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ının DragStart başlatıldıktan sonra nesneyi sürüklemeye devam ettiğinde tetiklenir. |
| DragEnd | Bir kullanıcının nesneyi sürüklemeyi durdurduğunda tetiklenir. |
Aşağıdaki kaydırıcı, hareketini konteyner alanı içinde sınırlamak için BoundingUI olarak konteynerini belirler ve ölçek tabanlı TranslateLine sürüklemesini, ek betik yazmadan konteynerin tam genişliğiyle sınırlı hale getirir.
-- Hiyerarşi KaydırıcıKonteyner ⟩ Kolu ⟩ UIDragDetector ⟩ (bu betik)
local sliderContainer = script.Parent.Parent.Parent
local handle = sliderContainer:FindFirstChild("Handle")
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- Ölçekle sürüklemeyi ayarla
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.TranslateLine -- Sürüklemeyi çizgiyle sınırlayın
uiDragDetector.BoundingUI = sliderContainer
-- Başlangıçta konteynerin şeffaflığını kolun X ölçek değerine ayarlayın
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
-- Tutma başlangıcını belirtmek için kolun kenarını genişletin
uiDragDetector.DragStart:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 6
end)
-- Ölçekle ne kadar sürüklendiğine göre şeffaflığı değiştirin
uiDragDetector.DragContinue:Connect(function(inputPosition)
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
end)
-- Tutma sonunu belirtmek için kolun kenarını geri döndürün
uiDragDetector.DragEnd:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 4
end)Pozisyon ve döndürme değişiklikleri
Olay sinyalleri dışında, dedektörün DragUDim2 ve/veya DragRotation özelliklerindeki değişiklikleri doğrudan izleyebilirsiniz.
Aşağıdaki dedektör, kullanıcıların renk döndürücü halkası etrafında kolu sürüklemesine olanak tanıyan DragStyle değerini Rotate olarak ayarlamıştır ve sürükleme döndürme değişikliklerini Instance:GetPropertyChangedSignal() aracılığıyla tespit eder.
local handle = script.Parent.Parent -- Sürüklemek için UI öğesi
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.Rotate -- Sürükleme stilini döndürme olarak ayarla
local function changeHue()
local currAngle = (math.fmod(handle.Rotation, 360)) / 360
if currAngle < 0 then
currAngle += 1
end
handle.BackgroundColor3 = Color3.fromHSV(currAngle, 1, 1)
end
-- Başlangıçta rengi kolun döndürmesine ayarlayın
changeHue()
-- Dedektörün sürükleme döndürmesi için GetPropertyChangedSignal() işlevine bağlayın
uiDragDetector:GetPropertyChangedSignal("DragRotation"):Connect(changeHue)Betiklenmiş sürükleme stili
Bir dedektörün UIDragDetector.DragStyle değerini Enum.UIDragDetectorDragStyle.Scriptable olarak ayarlarsanız, bir Vector2 girdi pozisyonunu alıp bir UDim2 (pozisyon) ve bir float (döndürme) döndüren kendi işlevinizi sağlayabilirsiniz. Dedektör, döndürülen pozisyon/döndürme değerine göre nesneyi günceller, DragSpace özelliği ve DragRelativity özelliği kullanılır.
Varsayılan olarak, döndürülen UDim2 ve float, dedektörün ebeveyninin yerel alanındaki son istenen pozisyon/döndürme olacaktır. Mevcut çeviri/döndürme sınırları ve belirli bir BoundingUI örneği tarafından dayatılan sınırlar hala geçerli olacaktır.
Aşağıdaki örnek, X koordinat girdi değişimine göre hesaplanan bir sinüs dalgasını takip eden bir UI öğesini sürükler. Not: dedektörün DragSpace değeri Enum.UIDragDetectorDragSpace.Relative olarak ayarlanmıştır.
local frame = script.Parent -- Sürüklemek için UI öğesi
local uiDragDetector = frame:FindFirstChildWhichIsA("UIDragDetector")
local initialXValue = 0
local maxHeightChange = 200
local pixelsPerRadian = 75 -- Frekansı artırmak için bu değeri düşürün
uiDragDetector.DragStart:Connect(function(inputPosition)
initialXValue = inputPosition.X
end)
local function computeSinWaveCoordinate(inputPosition)
local deltaX = inputPosition.X - initialXValue
-- Pozitif Y değişimi ile ekranın "yukarı" gitmesi için negatif Y delta
local deltaY = -math.sin(deltaX / pixelsPerRadian) * maxHeightChange
return UDim2.fromOffset(deltaX, deltaY)
end
uiDragDetector:SetDragStyleFunction(computeSinWaveCoordinate)Özel kısıtlama işlevi
UIDragDetectors, ızgara ve yakalama hakkında yerleşik hareket kurallarına sahip değildir, ancak dedektörün UIDragDetector.DragUDim2 ve UIDragDetector.DragRotation değerlerini uygulanmadan önce düzenlemek için özel kısıtlama işlevleri kaydedebilirsiniz. Örneğin, belirli artışlara yuvarlayarak hareketi bir ızgarada tutabilir veya izin verilen hareket alanlarını tanımlayabilirsiniz. Not: Bu, mevcut çeviri/döndürme sınırlarından önce uygulanır.
Aşağıdaki örnek, düzlemsel sürüklemeyi satır ve sütun sayısına dayalı olarak bir X/Y ızgarasına sıkıştıran bir kısıtlama işlevi kullanır. Not: dedektörün ResponseStyle değeri Enum.UIDragDetectorResponseStyle.Scale olarak ayarlanmıştır ve BoundingUI ızgara konteynerine ayarlanmıştır.
-- Hiyerarşi IzgaraKonteyner ⟩ Kolu ⟩ UIDragDetector ⟩ (bu betik)
local gridContainer = script.Parent.Parent.Parent
local handle = gridContainer:FindFirstChild("Handle") -- Sürüklemek için UI öğesi
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- Ölçekle sürüklemeyi ayarla
uiDragDetector.DragRelativity = Enum.UIDragDetectorDragRelativity.Relative
uiDragDetector.BoundingUI = gridContainer
local NUM_COLUMNS = 10
local NUM_ROWS = 5
local xScaleIncrement = 1 / NUM_COLUMNS
local yScaleIncrement = 1 / NUM_ROWS
local initialParentPosition = uiDragDetector.Parent.Position
uiDragDetector.DragStart:Connect(function()
initialParentPosition = uiDragDetector.Parent.Position
end)
local function dragToGridOnly(proposedPosition, proposedRotation)
local griddedXScale = math.round(proposedPosition.X.Scale / xScaleIncrement) * xScaleIncrement
local griddedYScale = math.round(proposedPosition.Y.Scale / yScaleIncrement) * yScaleIncrement
return UDim2.fromScale(griddedXScale, griddedYScale), proposedRotation
end
uiDragDetector:AddConstraintFunction(1, dragToGridOnly)