Detektor Seret UI

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Instansi UIDragDetector memfasilitasi dan mendorong interaksi dengan elemen antarmuka pengguna 2D dalam pengalaman, seperti penggeser, pemutar, dan lainnya. Fitur utama meliputi:

  • Tempatkan UIDragDetector di bawah instansi GuiObject mana pun untuk membuatnya bisa diseret menggunakan semua input pengguna tanpa satu baris kode pun.

  • Pilih dari beberapa opsi DragStyle, tentukan bagaimana objek merespons gerakan melalui ResponseStyle, dan jika perlu terapkan sumbu, batas gerakan, atau batas seret.

  • Skrip dapat merespons manipulasi objek yang diseret untuk menggerakkan logika respons, seperti mengubah pengaturan.

  • UIDragDetectors bekerja dalam mode edit dan main di Studio selama Anda tidak menggunakan alat Pilih, Gerakkan, Skala, atau Putar, maupun plugin tertentu atau alat editor UI di Studio.

Membuat elemen UI dapat diseret

Untuk membuat instansi GuiObject mana pun dapat diseret, cukup tambahkan UIDragDetector sebagai keturunan langsung.

  1. Di jendela Explorer, arahkan kursor Anda di atas instansi GuiObject dan klik tombol ⊕. Menu kontekstual akan ditampilkan.

  2. Dari menu, masukkan UIDragDetector.

  3. Secara default, objek sekarang akan dapat diseret dalam antarmuka LayerCollector.

Kustomisasi detektor seret UI

Gaya seret

UIDragDetectors memetakan gerakan kursor untuk menghitung gerakan 2D dan/atau rotasi yang diusulkan. Melalui properti DragStyle, Anda dapat memilih dari pemetaan berbeda untuk memenuhi kebutuhan Anda. Sebagai contoh, Enum.UIDragDetectorDragStyle.TranslatePlane menghasilkan terjemahan dalam bidang 2D dari LayerCollector, sedangkan Enum.UIDragDetectorDragStyle.Rotate biasanya menghasilkan rotasi alih-alih terjemahan.

PengaturanDeskripsi
TranslateLineGerakan 1D sepanjang DragAxis detektor.
TranslatePlaneGerakan 2D dalam bidang LayerCollector.
RotateSecara default, rotasi tentang posisi pusat mutlak dari induk detektor GuiObject. Jika ReferenceUIInstance diatur, rotasi terjadi di posisi pusat mutlak instansi itu.
ScriptableMenghitung gerakan yang diinginkan melalui fungsi kustom yang disediakan melalui SetDragStyleFunction().

Arah seret

Secara default, gerakan 2D dan DragStyle yang terkait dipetakan ke ruang dari nenek moyang LayerCollector. Namun, Anda mungkin ingin mengubah ReferenceUIInstance atau DragAxis saat membangun komponen UI yang berbeda.

PengaturanDeskripsiDefault
ReferenceUIInstanceSebuah instansi GuiObject yang ruang lokal dan posisi pusat absolutnya adalah ruang referensi dan asal untuk detektor. Mengatur referensi ini mempengaruhi properti seperti DragUDim2, DragRotation, dan perilaku DragAxis.nil
DragAxisNilai Vector2 yang mendefinisikan sumbu gerakan untuk objek yang diseret saat DragStyle diatur ke Enum.UIDragDetectorDragStyle.TranslateLine. Sumbu ini ditentukan dalam ruang lokal dari UIDragDetector kecuali ReferenceUIInstance didefinisikan, di mana sumbu ditentukan dalam ruang lokal instansi tersebut.(1, 0)

Respons terhadap gerakan

Properti UIDragDetector.ResponseStyle menentukan bagaimana nilai posisi objek diubah oleh gerakan yang diusulkan. Gaya respons kustom memungkinkan Anda menggunakan nilai UIDragDetector.DragUDim2 dan UIDragDetector.DragRotation yang dihasilkan sesuai kebutuhan, tanpa membuat induk detektor mengeksekusi gerakan yang diusulkan.

PengaturanDeskripsi
OffsetPindahkan berdasarkan nilai Offset posisi GuiObject induk detektor. Ini adalah pengaturan secara default.
ScalePindahkan berdasarkan nilai Scale posisi GuiObject induk detektor.
CustomOffsetElemen UI tidak akan bergerak sama sekali, tetapi nilai Offset dari DragUDim2 detektor tetap akan diupdate dan kejadian detektor akan tetap dipicu, memungkinkan Anda merespons manipulasi seret dengan cara yang Anda inginkan.
CustomScaleElemen UI tidak akan bergerak sama sekali, tetapi nilai Scale dari DragUDim2 detektor tetap akan diperbarui dan kejadian detektor akan tetap dipicu, memungkinkan Anda merespons manipulasi seret dengan cara yang Anda inginkan.

Batasan translasi & rotasi

Secara default, tidak ada batasan pada gerakan 2D di belakang pembatasan bawaan dari DragStyle. Batas untuk terjemahan dan rotasi minimum dan maksimum dapat dinyatakan dengan properti berikut jika diinginkan. Selain itu, Anda dapat mendefinisikan bagaimana objek yang diseret dibatasi dalam batas-batas dari GuiObject tertentu seperti Frame.

PropertiDeskripsiDefault
MinDragTranslation
MaxDragTranslation
Batas untuk terjemahan seret di setiap dimensi, didefinisikan oleh nilai UDim2. Jika MaxDragTranslation lebih besar dari MinDragTranslation, terjemahan akan dibatasi dalam rentang tersebut.{0, 0}, {0, 0}
MinDragAngle
MaxDragAngle
Hanya relevan jika DragStyle diatur ke Enum.UIDragDetectorDragStyle.Rotate, atau jika fungsi yang ditetapkan melalui SetDragStyleFunction() atau AddConstraintFunction() mendefinisikan nilai rotasi. Jika MaxDragAngle lebih besar dari MinDragAngle, rotasi akan dibatasi dalam rentang tersebut.0
BoundingBehaviorMenentukan perilaku pembatasan instansi UIDragDetector ketika BoundingUI diatur. Mengatur ini ke EntireObject membatasi seluruh UI yang diseret dalam BoundingUI, sedangkan mengatur ini ke HitPoint membatasi UI yang diseret hanya oleh titik hit/grab yang tepat dan posisi respectifnya setelah translasi/rotasi. Sebagai kenyamanan, default Automatic meniru perilaku EntireObject untuk objek UI yang sepenuhnya terkandung oleh BoundingUI, jika tidak HitPoint untuk objek UI yang sebagian berada di luar BoundingUI.Automatic

Penyesuaian kecepatan

Melalui SelectionModeDragSpeed dan SelectionModeRotateSpeed, Anda dapat menyempurnakan kecepatan maksimum seret/putar untuk detektor. Selanjutnya, melalui UIDragSpeedAxisMapping, Anda dapat menyempurnakan kecepatan seret di dimensi X/Y, berdasarkan SelectionModeDragSpeed detektor.

PropertiDeskripsi
SelectionModeDragSpeedMenentukan kecepatan maksimum seret untuk terjemahan sebagai kombinasi dari Scale dan Offset dari nenek moyang pertama ScreenGui atau SurfaceGui yang dimiliki UIDragDetector.
SelectionModeRotateSpeedMenentukan sudut maksimum per detik di mana UIDragDetector dapat berputar.
UIDragSpeedAxisMappingMenentukan kecepatan seret dimensi X/Y, berdasarkan SelectionModeDragSpeed detektor. Default adalah XY, yang berarti kecepatan sumbu X dan Y berdasarkan nilai X dan Y Scale/Offset masing-masing.

Alternatifnya adalah XX dan YY, yang berarti kecepatan sumbu X dan Y berdasarkan sumbu X (XX) atau Y (YY) untuk Scale, sementara nilai Offset tetap berlaku untuk sumbu masing-masing. Misalnya, jika nenek moyang pertama ScreenGui berukuran 800×600 dan SelectionModeDragSpeed adalah {0.1, 10}, {0.1, 20}, pengaturan XX menghasilkan kecepatan seret X/Y 80+10/80+20, sementara YY menghasilkan 60+10/60+20 (catat bahwa nilai Offset tetap sama dalam kedua kasus).

Respons skrip terhadap klik dan seret

Melalui sinyal peristiwa, perubahan properti, gaya seret Scriptable, dan fungsi kustom, skrip dapat merespons manipulasi elemen UI yang diseret untuk menggerakkan berbagai pengaturan atau membuat keputusan logis, seperti penggeser yang mengatur volume musik dan efek suara secara terpisah.

Sinyal peristiwa

Melalui sinyal peristiwa berikut, Anda dapat mendeteksi ketika pengguna memulai, melanjutkan, dan mengakhiri penggeseran objek.

PeristiwaDeskripsi
DragStartDipicu ketika pengguna mulai menyeret objek.
DragContinueDipicu ketika pengguna melanjutkan penarikan objek setelah DragStart telah diinisiasi.
DragEndDipicu ketika pengguna berhenti menyeret objek.

Penggeser berikut menetapkan wadahnya sebagai BoundingUI untuk membatasi gerakannya dalam area wadah, memungkinkan gaya seret berbasis skala TranslateLine dibatasi ke penuh lebar wadah tanpa pemrograman tambahan.

UIDragDetector - Perubahan Transparansi Sinyal Peristiwa

-- Hierarki adalah SliderContainer ⟩ Handle ⟩ UIDragDetector ⟩ (skrip ini)
local sliderContainer = script.Parent.Parent.Parent
local handle = sliderContainer:FindFirstChild("Handle")
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- Menetapkan seret berdasarkan skala
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.TranslateLine -- Membatasi seret pada garis
uiDragDetector.BoundingUI = sliderContainer
-- Awalnya set transparansi wadah ke nilai skala X dari pegangan
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
-- Perluas batas pegangan untuk menunjukkan awal pengambilan
uiDragDetector.DragStart:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 6
end)
-- Ubah transparansi berdasarkan seberapa banyak ia diseret dalam skala
uiDragDetector.DragContinue:Connect(function(inputPosition)
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
end)
-- Kembalikan batas pegangan untuk menunjukkan akhir pengambilan
uiDragDetector.DragEnd:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 4
end)

Perubahan posisi & rotasi

Selain sinyal peristiwa, Anda dapat memantau perubahan pada DragUDim2 dan/atau properti DragRotation detektor secara langsung.

Detektor berikut memiliki DragStyle diatur ke Rotate, memungkinkan pengguna untuk menggeser pegangan di sekitar cincin rotator hue, sambil mendeteksi perubahan rotasi seret melalui Instance:GetPropertyChangedSignal().

UIDragDetector - Perubahan DragRotation

local handle = script.Parent.Parent -- Elemen UI untuk diseret
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.Rotate -- Menetapkan gaya seret untuk berputar
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
-- Awalnya atur hue sesuai rotasi pegangan
changeHue()
-- Sambungkan fungsi ke GetPropertyChangedSignal() dari rotasi seret detektor
uiDragDetector:GetPropertyChangedSignal("DragRotation"):Connect(changeHue)

Gaya seret terprogram

Jika Anda mengatur UIDragDetector.DragStyle dari detektor ke Enum.UIDragDetectorDragStyle.Scriptable, Anda dapat menyediakan fungsi Anda sendiri yang menerima Vector2 dari posisi input dan mengembalikan UDim2 (posisi) dan float (rotasi). Detektor akan memperbarui objek ke posisi/rotasi yang dihitung berdasarkan pengembalian, properti DragSpace, dan properti DragRelativity.

Secara default, nilai UDim2 dan float yang dikembalikan akan menjadi posisi/rotasi akhir yang diinginkan dalam ruang lokal dari induk detektor. Batasan translasi/rotasi yang ada tetap berlaku, begitu juga batas yang dikenakan oleh instansi BoundingUI yang ditentukan.

Contoh berikut menyeret elemen UI mengikuti gelombang sinus yang dihitung berdasarkan perubahan dalam koordinat X input. Catat bahwa DragSpace detektor diatur ke Enum.UIDragDetectorDragSpace.Relative.

UIDragDetector - Drag Mengikuti Gelombang Sinus

local frame = script.Parent -- Elemen UI untuk diseret
local uiDragDetector = frame:FindFirstChildWhichIsA("UIDragDetector")
local initialXValue = 0
local maxHeightChange = 200
local pixelsPerRadian = 75 -- Turunkan nilai ini untuk meningkatkan frekuensi
uiDragDetector.DragStart:Connect(function(inputPosition)
initialXValue = inputPosition.X
end)
local function computeSinWaveCoordinate(inputPosition)
local deltaX = inputPosition.X - initialXValue
-- Delta Y negatif sehingga bergerak "naik" di layar dengan perubahan Y positif
local deltaY = -math.sin(deltaX / pixelsPerRadian) * maxHeightChange
return UDim2.fromOffset(deltaX, deltaY)
end
uiDragDetector:SetDragStyleFunction(computeSinWaveCoordinate)

Fungsi kendala kustom

UIDragDetectors tidak memiliki aturan gerakan bawaan tentang grid dan snapping, tetapi Anda dapat mendaftar fungsi kendala kustom untuk mengedit UIDragDetector.DragUDim2 dan UIDragDetector.DragRotation detektor sebelum diterapkan. Misalnya, Anda dapat menjaga gerakan di grid dengan membulatkan posisi ke kenaikan tertentu, atau mendefinisikan area gerakan yang diizinkan. Catat bahwa ini diterapkan sebelum batas translasi/rotasi yang ada.

Contoh berikut memanfaatkan fungsi kendala yang membatasi seret planar ke grid X/Y berdasarkan jumlah baris dan kolom. Catat bahwa ResponseStyle detektor diatur ke Enum.UIDragDetectorResponseStyle.Scale dan BoundingUI diatur ke wadah grid.

UIDragDetector - Seret di Grid, Menempel pada Ubin

-- Hierarki adalah GridContainer ⟩ Handle ⟩ UIDragDetector ⟩ (skrip ini)
local gridContainer = script.Parent.Parent.Parent
local handle = gridContainer:FindFirstChild("Handle") -- Elemen UI untuk diseret
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- Menetapkan seret berdasarkan skala
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)
©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.