UIDragDetector インスタンスは、スライダー、スピナーなど、体験内の2Dユーザーインターフェース要素とのインタラクションを促進し、奨励します。主な機能は次のとおりです。
どの GuiObject インスタンスの下にも UIDragDetector を配置することで、コードの1行も使わずにすべてのユーザー入力を介してドラッグ可能にします。
複数の DragStyle オプションから選び、ResponseStyle を介してオブジェクトの動きに対する応答方法を定義し、オプションで軸、移動制限、ドラッグ境界を適用できます。
スクリプトは、ドラッグされたオブジェクトの操作に応じてロジック応答を促すことができ、設定を調整することができます。
UIDragDetectors はスタジオの編集とプレイモードで機能しますが、Select、Move、Scale、Rotate ツールや特定のプラグイン、スタジオの UI エディターツールを使用していない限り機能します。
UI要素をドラッグ可能にする
任意の GuiObject インスタンスをドラッグ可能にするには、単に UIDragDetector を直接の子として追加します。
メニューから UIDragDetector を挿入します。

デフォルトで、オブジェクトは LayerCollector インターフェイス内でドラッグ可能になります。
UIドラッグ検出器のカスタマイズ
ドラッグスタイル
UIDragDetectors は、カーソルの動きをマッピングして提案された2Dの動きや回転を計算します。DragStyle プロパティを介して、ニーズに合ったさまざまなマッピングから選択できます。たとえば、Enum.UIDragDetectorDragStyle.TranslatePlane は、LayerCollector の2D平面での変換を生成しますが、Enum.UIDragDetectorDragStyle.Rotate は通常は変換の代わりに回転を生成します。
| 設定 | 説明 |
|---|---|
| TranslateLine | 検出器の DragAxis に沿った1Dの動き。 |
| TranslatePlane | LayerCollector の平面内での2Dの動き。 |
| Rotate | デフォルトでは、検出器の親 GuiObject の絶対中心位置を中心に回転します。ReferenceUIInstance が設定されている場合、そのインスタンスの絶対中心位置を中心に回転が行われます。 |
| Scriptable | SetDragStyleFunction() を通じて提供されたカスタム関数を介して希望の動きを計算します。 |
ドラッグ方向
デフォルトでは、2Dの動きと関連する DragStyle は、祖先 LayerCollector の空間にマッピングされます。しかし、異なるUIコンポーネントを構築する際に、ReferenceUIInstance または DragAxis を変更する必要があるかもしれません。
| 設定 | 説明 | デフォルト |
|---|---|---|
| ReferenceUIInstance | 検出器の参照空間と原点となるローカル空間と絶対中心位置を持つ GuiObject インスタンス。これを設定すると、DragUDim2、DragRotation、および DragAxis の動作に影響します。 | nil |
| DragAxis | Vector2 値で、DragStyle が Enum.UIDragDetectorDragStyle.TranslateLine に設定されているときに、ドラッグされたオブジェクトの移動軸を定義します。軸は UIDragDetector のローカル空間で定義されますが、ReferenceUIInstance が定義されている場合、そのインスタンスのローカル空間で軸が定義されます。 | (1, 0) |
動きへの応答
UIDragDetector.ResponseStyle プロパティは、オブジェクトの位置値が提案された動きによってどのように変更されるかを指定します。カスタム応答スタイルを使用することで、結果として得られる UIDragDetector.DragUDim2 と UIDragDetector.DragRotation の値を必要に応じて使用でき、検出器の親が提案された動きを実行することはありません。
| 設定 | 説明 |
|---|---|
| Offset | 検出器の親の GuiObject.Position 値の Offset 値によって移動します。これがデフォルトの設定です。 |
| Scale | 検出器の親の GuiObject.Position 値の Scale 値によって移動します。 |
| CustomOffset | UI要素は全く移動しませんが、検出器の DragUDim2 の Offset 値は更新され、検出器のイベントは発火し続けるため、ドラッグ操作に応じて任意のように反応できます。 |
| CustomScale | UI要素は全く移動しませんが、検出器の DragUDim2 の Scale 値は更新され、検出器のイベントは発火し続けるため、ドラッグ操作に応じて任意のように反応できます。 |
移動および回転制限
デフォルトでは、DragStyle の固有の制約を除いて、2D動きに制限はありません。移動および回転の最小および最大制限は、必要に応じて以下のプロパティを使用して宣言できます。さらに、ドラッグされたオブジェクトが特定の GuiObject (たとえば、Frame)内でどのように制約されるかを定義できます。
| プロパティ | 説明 | デフォルト |
|---|---|---|
| MinDragTranslation MaxDragTranslation | 各次元のドラッグ変換の制限。UDim2 値で定義されます。MaxDragTranslation が MinDragTranslation より大きい場合、変換はその範囲内に制約されます。 | {0, 0}, {0, 0} |
| MinDragAngle MaxDragAngle | DragStyle が Enum.UIDragDetectorDragStyle.Rotate に設定されている場合や、SetDragStyleFunction() または AddConstraintFunction() を通じて設定された関数で回転値が定義されている場合にのみ関連します。MaxDragAngle が MinDragAngle より大きい場合、回転はその範囲内に制約されます。 | 0 |
| BoundingBehavior | BoundingUI が設定されているときの UIDragDetector インスタンスの境界動作を決定します。これを EntireObject に設定すると、ドラッグされたUI全体が BoundingUI に制約され、HitPoint に設定すると、丁度ヒット/グラブポイントによってドラッグされたUIが制約され、座標移動/回転後のそれぞれの位置に基づきます。便利なことに、Automatic のデフォルトは、BoundingUI に完全に含まれるUIオブジェクトに対しては EntireObject の動作を模倣し、さもなくば BoundingUI の外に部分的に存在するUIオブジェクトには HitPoint を適用します。 | Automatic |
速度調整
SelectionModeDragSpeed と SelectionModeRotateSpeed を通じて、検出器の最大ドラッグ/回転速度を微調整できます。さらに、UIDragSpeedAxisMapping を介して、検出器の SelectionModeDragSpeed に基づいて X/Y 次元のドラッグ速度を微調整できます。
| プロパティ | 説明 |
|---|---|
| SelectionModeDragSpeed | 検出器が属する最初の祖先 ScreenGui または SurfaceGui の Scale と Offset の組み合わせとして、移動の最大ドラッグ速度を定義します。 |
| SelectionModeRotateSpeed | UIDragDetector が回転できる最大角度(毎秒)を定義します。 |
| UIDragSpeedAxisMapping | 検出器の SelectionModeDragSpeed に基づいて X/Y 次元のドラッグ速度を決定します。デフォルトは XY で、これは X と Y 軸速度がそれぞれ X と Y の Scale / Offset 値に基づくことを意味します。 代替案として XX と YY があり、これは X および Y 軸速度がそれぞれ Scale の X (XX)または Y (YY)軸に基づきますが、Offset 値はそれぞれの軸に対してそのまま適用されます。たとえば、最初の祖先 ScreenGui が 800×600 のサイズで、SelectionModeDragSpeed が {0.1, 10}, {0.1, 20} の場合、XX 設定は X/Y のドラッグ速度を 80+10 / 80+20 に結果づけ、YY 設定は 60+10 / 60+20 となります(Offset 値は両方のケースで同じままです)。 |
クリックおよびドラッグに対するスクリプトの応答
イベント信号、プロパティの変更、Scriptable ドラッグスタイル、およびカスタム関数を通じて、スクリプトはドラッグされたUI要素の操作に応じてさまざまな設定を駆動したり、音楽やサウンドエフェクトの音量を個別に調整するスライダーのように論理的な決定を行ったりできます。
イベントシグナル
次のイベントシグナルを通じて、ユーザーがオブジェクトのドラッグを開始、継続、終了したときを検出できます。
| イベント | 説明 |
|---|---|
| DragStart | ユーザーがオブジェクトのドラッグを開始したときに発火します。 |
| DragContinue | ユーザーが DragStart を開始した後にオブジェクトのドラッグを続けると発火します。 |
| DragEnd | ユーザーがオブジェクトのドラッグを停止したときに発火します。 |
次のスライダーは、そのコンテナを BoundingUI として指定し、コンテナエリア内での移動を制限し、スケールに基づいた TranslateLine ドラッグを、追加のスクリプトなしでコンテナの幅全体に制限します。
UIDragDetector - イベントシグナル透明度変更
-- 階層は SliderContainer ⟩ Handle ⟩ UIDragDetector ⟩ (このスクリプト)
local sliderContainer = script.Parent.Parent.Parent
local handle = sliderContainer:FindFirstChild("Handle")
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- スケールでドラッグするように設定
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.TranslateLine -- ドラッグをラインに制限
uiDragDetector.BoundingUI = sliderContainer
-- 初期状態でハンドルのXスケール値に透明度を設定
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
-- グラブ開始を示すためにハンドルのボーダーを拡張
uiDragDetector.DragStart:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 6
end)
-- スケールでどのぐらいドラッグされたかによって透明度を変更
uiDragDetector.DragContinue:Connect(function(inputPosition)
sliderContainer.BackgroundTransparency = 1 - handle.Position.X.Scale
end)
-- グラブ終了を示すためにハンドルのボーダーを元に戻す
uiDragDetector.DragEnd:Connect(function(inputPosition)
handle:FindFirstChildWhichIsA("UIStroke").Thickness = 4
end)
位置および回転の変更
イベントシグナル に加えて、検出器の DragUDim2 と/または DragRotation プロパティの変更を直接監視できます。
次の検出器はその DragStyle を Rotate に設定しており、ユーザーは色相回転リングをドラッグでき、同時に Instance:GetPropertyChangedSignal() を通じてドラッグ回転の変更を検出します。
UIDragDetector - DragRotation変更
local handle = script.Parent.Parent -- ドラッグするUI要素
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.DragStyle = Enum.UIDragDetectorDragStyle.Rotate -- ドラッグスタイルを回転に設定
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
-- 初期状態でハンドルの回転に色相を設定
changeHue()
-- 検出器のドラッグ回転の GetPropertyChangedSignal() に関数を接続
uiDragDetector:GetPropertyChangedSignal("DragRotation"):Connect(changeHue)
スクリプトによるドラッグスタイル
検出器の UIDragDetector.DragStyle を Enum.UIDragDetectorDragStyle.Scriptable に設定した場合、入力位置の Vector2 を受け取り、UDim2(位置)および float(回転)を返す関数を提供できます。検出器は、戻り値に基づいてオブジェクトを計算された位置/回転に更新します。また、DragSpace プロパティおよび DragRelativity プロパティも利用されます。
デフォルトでは、戻り値の UDim2 と float は検出器の親のローカル空間における 最終的な 希望位置/回転になります。既存の移動/回転制限は引き続き適用され、指定された BoundingUI インスタンスによって課せられた境界制限も適用されます。
次の例は、X 座標の入力の変化に基づいて計算されたサイン波に従ってUI要素をドラッグします。検出器の DragSpace は Enum.UIDragDetectorDragSpace.Relative に設定されていることに注意してください。
UIDragDetector - サイン波を追従するドラッグ
local frame = script.Parent -- ドラッグするUI要素
local uiDragDetector = frame:FindFirstChildWhichIsA("UIDragDetector")
local initialXValue = 0
local maxHeightChange = 200
local pixelsPerRadian = 75 -- この値を下げると周波数が増加します
uiDragDetector.DragStart:Connect(function(inputPosition)
initialXValue = inputPosition.X
end)
local function computeSinWaveCoordinate(inputPosition)
local deltaX = inputPosition.X - initialXValue
-- 正のY変化で画面上で「上」に行くように負のYデルタ
local deltaY = -math.sin(deltaX / pixelsPerRadian) * maxHeightChange
return UDim2.fromOffset(deltaX, deltaY)
end
uiDragDetector:SetDragStyleFunction(computeSinWaveCoordinate)
カスタム制約関数
UIDragDetectors にはグリッドやスナッピングに関するビルトインの動きの規則がありませんが、検出器の UIDragDetector.DragUDim2 と UIDragDetector.DragRotation が適用される前に編集するカスタム制約関数を登録できます。たとえば、特定の増分に位置を丸めることによって動きをグリッドの上に保つことや、動くことができる領域を定義することができます。この処理は、既存の移動/回転制限の 前 に適用されることに注意してください。
次の例は、行と列の数に基づいて平面的なドラッグを X/Y グリッドにクランプする制約関数を利用しています。検出器の ResponseStyle は Enum.UIDragDetectorResponseStyle.Scale に設定されており、BoundingUI はグリッドコンテナに設定されています。
UIDragDetector - グリッドでのドラッグ、タイルにスナッピング
-- 階層は GridContainer ⟩ Handle ⟩ UIDragDetector ⟩ (このスクリプト)
local gridContainer = script.Parent.Parent.Parent
local handle = gridContainer:FindFirstChild("Handle") -- ドラッグするUI要素
local uiDragDetector = handle:FindFirstChildWhichIsA("UIDragDetector")
uiDragDetector.ResponseStyle = Enum.UIDragDetectorResponseStyle.Scale -- スケールでドラッグするように設定
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)