Instancja UIDragDetector ułatwia i zachęca do interakcji z elementami interfejsu użytkownika 2D w grze, takimi jak suwaki, pokrętła i inne. Kluczowe cechy obejmują:
Umieść UIDragDetector pod dowolną instancją GuiObject, aby uczynić ją przeciągalną za pomocą wszystkich wejść użytkownika bez jednej linii kodu.
Wybierz spośród kilku opcji DragStyle, zdefiniuj, jak obiekt reaguje na ruch za pomocą ResponseStyle, a opcjonalnie zastosuj osie, limity ruchu lub granice przeciągania.
Skrypty mogą reagować na manipulację przeciąganymi obiektami, aby napędzać odpowiedzi logiczne, takie jak dostosowywanie ustawień.
UIDragDetectors działają w trybie edycji i gry w Studio, o ile nie używasz narzędzi Wybierz, Przenieś, Skaluj ani Obróć, ani niektórych wtyczek lub narzędzi edytora UI w Studio.
Uczyń elementy UI przeciągalnymi
Aby uczynić dowolne instancje GuiObject przeciągalnymi, wystarczy dodać UIDragDetector jako bezpośredniego potomka.
W oknie Eksploratora najedź na instancję GuiObject i kliknij przycisk ⊕. Wyświetli się menu kontekstowe.
Z menu wstaw UIDragDetector.

Domyślnie obiekt będzie teraz przeciągalny w interfejsie LayerCollector.
Dostosuj detektory przeciągania UI
Styl przeciągania
UIDragDetectors mapują ruch kursora, aby obliczyć proponowany ruch 2D i/lub obrót. Dzięki właściwości DragStyle możesz wybierać spośród różnych mapowań, aby dostosować je do swoich potrzeb. Na przykład Enum.UIDragDetectorDragStyle.TranslatePlane produkuje translację w 2D w płaszczyźnie LayerCollector, podczas gdy Enum.UIDragDetectorDragStyle.Rotate normalnie produkuje obrót zamiast translacji.
| Ustawienie | Opis |
|---|---|
| TranslateLine | Ruch 1D wzdłuż DragAxis detektora. |
| TranslatePlane | Ruch 2D w płaszczyźnie LayerCollector. |
| Rotate | Domyślnie obrót wokół absolutnej pozycji środkowej rodzica detektora GuiObject. Jeśli ReferenceUIInstance jest ustawione, obrót odbywa się wokół absolutnej pozycji środkowej tej instancji. |
| Scriptable | Oblicza pożądany ruch za pomocą funkcji niestandardowej dostarczonej przez SetDragStyleFunction(). |
Kierunek przeciągania
Domyślnie ruch 2D i powiązany DragStyle mapują się na przestrzeń przodka LayerCollector. Możesz jednak chcieć zmienić ReferenceUIInstance lub DragAxis podczas budowania różnych komponentów UI.
| Ustawienie | Opis | Domyślnie |
|---|---|---|
| ReferenceUIInstance | Instancja GuiObject, której lokalna przestrzeń i absolutna pozycja środkowa są przestrzenią odniesienia i początkiem dla detektora. Ustawienie tego odniesienia wpływa na właściwości takie jak DragUDim2, DragRotation oraz zachowanie DragAxis. | nil |
| DragAxis | Wartość Vector2, która definiuje oś ruchu dla przeciąganego obiektu, gdy DragStyle jest ustawione na Enum.UIDragDetectorDragStyle.TranslateLine. Oś jest definiowana w lokalnej przestrzeni UIDragDetector, chyba że ReferenceUIInstance jest zdefiniowane, w takim przypadku oś jest definiowana w lokalnej przestrzeni tej instancji. | (1, 0) |
Odpowiedź na ruch
Właściwość UIDragDetector.ResponseStyle określa, jak wartość pozycji obiektu jest zmieniana przez proponowany ruch. Niestandardowe style odpowiedzi pozwalają na użycie wynikowych wartości UIDragDetector.DragUDim2 i UIDragDetector.DragRotation według uznania, bez konieczności wykonywania proponowanego ruchu przez rodzica detektora.
| Ustawienie | Opis |
|---|---|
| Offset | Przesuń według wartości Offset pozycji GuiObject rodzica detektora. To jest ustawienie domyślne. |
| Scale | Przesuń według wartości Scale pozycji GuiObject rodzica detektora. |
| CustomOffset | Element UI nie będzie się w ogóle poruszał, ale wartości Offset detektora DragUDim2 będą nadal aktualizowane, a zdarzenia detektora będą nadal wywoływane, co pozwala na reagowanie na manipulację przeciąganiem według własnego uznania. |
| CustomScale | Element UI nie będzie się w ogóle poruszał, ale wartości Scale detektora DragUDim2 będą nadal aktualizowane, a zdarzenia detektora będą nadal wywoływane, co pozwala na reagowanie na manipulację przeciąganiem według własnego uznania. |
Limity translacji i obrotu
Domyślnie nie ma limitów dla ruchu 2D poza wrodzonymi ograniczeniami DragStyle. Limity dla minimalnych i maksymalnych translacji oraz obrotów można zadeklarować za pomocą następujących właściwości, jeśli jest to pożądane. Dodatkowo możesz zdefiniować, jak przeciągany obiekt jest ograniczany w granicach określonego GuiObject, takiego jak Frame.
| Właściwości | Opis | Domyślnie |
|---|---|---|
| MinDragTranslation MaxDragTranslation | Limity dla translacji przeciągania w każdej wymiarze, definiowane przez wartość UDim2. Jeśli MaxDragTranslation jest większe niż MinDragTranslation, translacja będzie ograniczona w tym zakresie. | {0, 0}, {0, 0} |
| MinDragAngle MaxDragAngle | Relewantne tylko wtedy, gdy DragStyle jest ustawione na Enum.UIDragDetectorDragStyle.Rotate, lub jeśli funkcje ustawione przez SetDragStyleFunction() lub AddConstraintFunction() definiują wartość obrotu. Jeśli MaxDragAngle jest większe niż MinDragAngle, obrót będzie ograniczony w tym zakresie. | 0 |
| BoundingBehavior | Określa zachowanie granic instancji UIDragDetector, gdy jej BoundingUI jest ustawione. Ustawienie tego na EntireObject ogranicza cały przeciągany UI w obrębie BoundingUI, podczas gdy ustawienie na HitPoint ogranicza przeciągany UI tylko do dokładnego punktu trafienia/chwytu i jego odpowiedniej pozycji po translacji/obrocie. Dla wygody, domyślne ustawienie Automatic naśladuje zachowanie EntireObject dla obiektu UI, który jest całkowicie zawarty w BoundingUI, lub HitPoint dla obiektu UI, który jest częściowo poza BoundingUI. | Automatic |
Dostosowanie prędkości
Dzięki SelectionModeDragSpeed i SelectionModeRotateSpeed możesz precyzyjnie dostosować maksymalne prędkości przeciągania/obracania dla detektora. Ponadto, dzięki UIDragSpeedAxisMapping, możesz precyzyjnie dostosować prędkości przeciągania w wymiarach X/Y, w oparciu o SelectionModeDragSpeed detektora.
| Właściwość | Opis |
|---|---|
| SelectionModeDragSpeed | Definiuje maksymalną prędkość przeciągania dla translacji jako kombinację Scale i Offset pierwszego przodka ScreenGui lub SurfaceGui, do którego należy UIDragDetector. |
| SelectionModeRotateSpeed | Definiuje maksymalny kąt na sekundę, w jakim UIDragDetector może się obracać. |
| UIDragSpeedAxisMapping | Określa prędkości przeciągania w wymiarach X/Y, w oparciu o SelectionModeDragSpeed detektora. Domyślnie jest to XY, co oznacza, że prędkości osi X i Y są oparte na wartościach X i Y Scale/Offset odpowiednio. Alternatywy to XX i YY, co oznacza, że prędkości osi X i Y są oparte na osi X (XX) lub osi Y (YY) dla Scale, podczas gdy wartości Offset nadal mają zastosowanie do ich odpowiednich osi. Na przykład, jeśli pierwszy przodek ScreenGui ma rozmiar 800×600, a SelectionModeDragSpeed to {0.1, 10}, {0.1, 20}, ustawienie XX skutkuje prędkością przeciągania X/Y równą 80+10/80+20, podczas gdy YY skutkuje 60+10/60+20 (zauważ, że wartości Offset pozostają takie same w obu przypadkach). |
Odpowiedzi skryptów na kliknięcia i przeciąganie
Dzięki sygnałom zdarzeń, zmianom właściwości, stylowi przeciągania Scriptable i funkcjom niestandardowym, skrypty mogą reagować na manipulację przeciąganymi elementami UI, aby napędzać różne ustawienia lub podejmować decyzje logiczne, takie jak suwaki, które dostosowują głośność muzyki i efektów dźwiękowych oddzielnie.
Sygnały zdarzeń
Dzięki następującym sygnałom zdarzeń możesz wykryć, kiedy użytkownik zaczyna, kontynuuje i kończy przeciąganie obiektu.
| Zdarzenie | Opis |
|---|---|
| DragStart | Wywoływane, gdy użytkownik zaczyna przeciągać obiekt. |
| DragContinue | Wywoływane, gdy użytkownik kontynuuje przeciąganie obiektu po zainicjowaniu DragStart. |
| DragEnd | Wywoływane, gdy użytkownik przestaje przeciągać obiekt. |
Następujący suwak wyznacza swój kontener jako BoundingUI, aby ograniczyć jego ruch w obrębie obszaru kontenera, pozwalając na ograniczenie przeciągania opartego na skali TranslateLine do pełnej szerokości kontenera bez dodatkowego skryptowania.
-- Hierarchia to SliderContainer ⟩ Handle ⟩ UIDragDetector ⟩ (ten skrypt)
local sliderContainer = script.Parent.Parent.Parent
local handle = sliderContainer:FindFirstChild("Handle")
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- Ustaw przeciąganie według skali
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.TranslateLine -- Ogranicza przeciąganie do linii
uiDragDetector.BoundingUI = sliderContainer
-- Początkowo ustaw przezroczystość kontenera na wartość skali X uchwytu
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
-- Powiększ granicę uchwytu, aby wskazać początek chwytu
uiDragDetector.DragStart:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 6
end)
-- Zmień przezroczystość w zależności od tego, jak bardzo został przeciągnięty w skali
uiDragDetector.DragContinue:Connect(function(inputPosition)
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
end)
-- Przywróć granicę uchwytu, aby wskazać koniec chwytu
uiDragDetector.DragEnd:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 4
end)Zmiany pozycji i obrotu
Oprócz sygnałów zdarzeń, możesz monitorować zmiany w DragUDim2 detektora i/lub właściwościach DragRotation bezpośrednio.
Następujący detektor ma ustawiony DragStyle na Rotate, co pozwala użytkownikom przeciągać uchwyt wokół pierścienia rotatora odcienia, jednocześnie wykrywając zmiany w obrocie przeciągania za pomocą Instance:GetPropertyChangedSignal().
local handle = script.Parent.Parent -- Element UI do przeciągania
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.Rotate -- Ustaw styl przeciągania na obrót
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
-- Początkowo ustaw odcień na obrót uchwytu
changeHue()
-- Połącz funkcję z GetPropertyChangedSignal() obrotu przeciągania detektora
uiDragDetector:GetPropertyChangedSignal("DragRotation"):Connect(changeHue)Skryptowy styl przeciągania
Jeśli ustawisz UIDragDetector.DragStyle detektora na Enum.UIDragDetectorDragStyle.Scriptable, możesz dostarczyć własną funkcję, która przyjmuje Vector2 pozycji wejściowej i zwraca UDim2 (pozycję) oraz float (obrót). Detektor zaktualizuje obiekt do obliczonej pozycji/obrotu na podstawie zwracanych wartości, właściwości DragSpace oraz DragRelativity.
Domyślnie zwracane UDim2 i float będą ostateczną pożądaną pozycją/obrotem w lokalnej przestrzeni rodzica detektora. Istniejące limity translacji/obrotu będą nadal miały zastosowanie, podobnie jak limity graniczne nałożone przez określoną instancję BoundingUI.
Następujący przykład przeciąga element UI wzdłuż fali sinusoidalnej obliczanej na podstawie zmiany współrzędnej X wejścia. Zauważ, że DragSpace detektora jest ustawione na Enum.UIDragDetectorDragSpace.Relative.
local frame = script.Parent -- Element UI do przeciągania
local uiDragDetector = frame:FindFirstChildWhichIsA("UIDragDetector")
local initialXValue = 0
local maxHeightChange = 200
local pixelsPerRadian = 75 -- Zmniejsz tę wartość, aby zwiększyć częstotliwość
uiDragDetector.DragStart:Connect(function(inputPosition)
initialXValue = inputPosition.X
end)
local function computeSinWaveCoordinate(inputPosition)
local deltaX = inputPosition.X - initialXValue
-- Ujemny deltaY, aby przesuwało "w górę" na ekranie przy dodatniej zmianie Y
local deltaY = -math.sin(deltaX / pixelsPerRadian) * maxHeightChange
return UDim2.fromOffset(deltaX, deltaY)
end
uiDragDetector:SetDragStyleFunction(computeSinWaveCoordinate)Niestandardowa funkcja ograniczająca
UIDragDetectors nie mają wbudowanych zasad ruchu dotyczących siatek i przyciągania, ale możesz zarejestrować niestandardowe funkcje ograniczające, aby edytować UIDragDetector.DragUDim2 i UIDragDetector.DragRotation detektora przed ich zastosowaniem. Na przykład możesz utrzymać ruch na siatce, zaokrąglając pozycje do określonych przyrostów lub definiując dozwolone obszary ruchu. Zauważ, że to jest stosowane przed jakimikolwiek istniejącymi limitami translacji/obrotu.
Następujący przykład wykorzystuje funkcję ograniczającą, która ogranicza przeciąganie płaszczyzny do siatki X/Y w oparciu o liczbę wierszy i kolumn. Zauważ, że ResponseStyle detektora jest ustawione na Enum.UIDragDetectorResponseStyle.Scale, a jego BoundingUI jest ustawione na kontener siatki.
-- Hierarchia to GridContainer ⟩ Handle ⟩ UIDragDetector ⟩ (ten skrypt)
local gridContainer = script.Parent.Parent.Parent
local handle = gridContainer:FindFirstChild("Handle") -- Element UI do przeciągania
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- Ustaw przeciąganie według skali
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)