UIドラッグ検出器

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

UIDragDetector インスタンスは、スライダー、スピナーなどのエクスペリエンス内の 2D ユーザーインターフェイス要素との相互作用を促進し、奨励します。主な機能には以下があります:

  • 任意の UIDragDetector インスタンスの下に GuiObject を配置して、コードの 1行もなくすべてのユーザー入力でドラッグできるようにします。

  • 複数の DragStyle オプションから選択し、オブジェクトがResponseStyle を介して動作にどのように応答するかを定義し、オプションで轴、移動制限、またはドラッグ境界を適用します。

  • スクリプトは、ドラッグされたオブジェクトの操作に応答して、設定の調整などのロジック応答をドライブできます。

  • スタジオの編集とプレイモードで作業し続ける限り、 使用していない 、 選択する 、 移動する 、 スケールする 、または 回転する ツール、および特定のプラグインまたはスタジオの UI エディタツールを使用していないこと。

UI 要素をドラッグ可能にする

どの GuiObject インスタンスもドラッグ可能にするには、単に直接の子孫として UIDragDetector を追加します。

  1. エクスプローラー ウィンドウで、GuiObject インスタンスをホバーし、⊕ ボタンをクリックします。コンテキストメニューが表示されます。

  2. メニューから、 UIDragDetector を挿入します。

  3. デフォルトでは、オブジェクトは現在 LayerCollector インターフェイスでドラッグ可能になります。

UI ドラッグ検出器をカスタマイズする

スタイルをドラッグ

UIDragDetectors マップカーソル移動を計算して、提案された 2D 動作と/または回転を計算する。DragStyle プロパティを通じて、ニーズに合わせて異なるマッピングから選択できます。たとえば、Enum.UIDragDetectorDragStyle.TranslatePlane は、LayerCollector の 2D プレーンで翻訳を生成し、Enum.UIDragDetectorDragStyle.Rotate は通常、翻訳ではなく回転を生成します。

設定説明
TranslateLine検出器の DragAxis 沿いの 1D モーション。
TranslatePlane2D モーションは、LayerCollector の平面で。
Rotateデフォルトでは、検出器の親の絶対中心位置に関する回転 GuiObjectReferenceUIInstance が設定する定されている場合、回転はそのインスタンスの絶対的な中心位置に起こります。
Scriptableカスタム関数を通じて提供される SetDragStyleFunction() を介して、希望する動作を計算します。

方向をドラッグ

デフォルトでは、2D モーションと関連する DragStyle マップが祖先のスペースにマップされます LayerCollector。しかし、異なる UI コンポーネントをビルドするときに ReferenceUIInstance または DragAxis を変更したい場合があります。

設定説明デフォルト
ReferenceUIInstanceローカルスペースと絶対中心位置が検出器の参照スペースと起源である GuiObject インスタンス。この参照を設定すると、DragUDim2DragRotation、および DragAxis のようなプロパティが影響を受けます。nil
DragAxisVector2 ドラッグ済みオブジェクトの移動軸を定義する値は、DragStyleEnum.UIDragDetectorDragStyle.TranslateLine に設定されたとき、ドラッグ済みオブジェクトの移動軸を定義する値は、 です。軸は、 が定義されていない限り、ローカルスペースで定義されます。その場合、軸はそのインスタンスのローカルスペースで定義されます。(1, 0)

モーションへの応答

UIDragDetector.ResponseStyle プロパティは、提案された動作によってオブジェクトの位置値が変更される方法を指定します。カスタム応答スタイルでは、検出器の親が提案された動作を実行しないで、結果の UIDragDetector.DragUDim2 および UIDragDetector.DragRotation 値を好きなように使用できます。

設定説明
Offset検出器の親の Offset 値の GuiObject.Position 値によって移動します。これはデフォルト設定です。
Scale検出器の親の Scale 値の GuiObject.Position 値によって移動します。
CustomOffsetUI 要素はまったすべて動かないが、検出器の 値は引き続き更新され、検出器のイベントは引き続き発動し、好きなようにドラッグ操作に応答できます。
CustomScaleUI 要素はまったすべて動かないが、検出器の 値は引き続き更新され、検出器のイベントは引き続き発動し、好きなようにドラッグ操作に応答できます。

翻訳と回転制限

デフォルトでは、DragStyle の内在する制限の後ろにある 2D モーションに制限はありません。最小と最大の翻訳と回転の制限は、必要に応じて以下のプロパティで宣言できます。さらに、ドラッグされたオブジェクトが指定された の境界内でどのように制限されるかを定義できます。

属性説明デフォルト
MinDragTranslation MaxDragTranslation各次元でドラッグ翻訳を制限する、UDim2 値によって定義される。If MaxDragTranslationMinDragTranslation より大きい場合、翻訳はその範囲内に収まります。0, 0, 0, 0
MinDragAngle MaxDragAngle関連するのは、DragStyleEnum.UIDragDetectorDragStyle.Rotate に設定されているか、または SetDragStyleFunction() または AddConstraintFunction() を通じて設定された関数が回転値を定義している場合のみです。If MaxDragAngleMinDragAngle より大きい場合、回転はその範囲内に制限されます。0
BoundingBehaviorUIDragDetector が設定されたとき、インスタンスのバインディング動作を決定します。BoundingUIこれを に設定すると、ドラッグされた UI 全体が 内に制限され、ドラッグされた UI を設定すると、正確なヒット/グラブポイントとその後の翻訳/回転によってのみドラッグされた UIが制限されます。便利のため、デフォルトの は、 に完全に含まれる UI オブジェクトの動作を模倣し、または 、または部分的に 外の UI オブジェクトの動作を模倣します。Automatic

スピード調整

通過 SelectionModeDragSpeedSelectionModeRotateSpeed で、検出器の最大ドラッグ/回転速度を微調整できます。さらに、UIDragSpeedAxisMapping を通じて、 X / Y 次元のドラッグ速度を調整できます、ディテクターのSelectionModeDragSpeedに基づいて。

性質説明
SelectionModeDragSpeed翻訳の最大ドラッグ速度を、最初の祖先 ScaleOffset の組み合わせ、または ScreenGui または SurfaceGui に属する UIDragDetector に設定します。
SelectionModeRotateSpeedUIDragDetector が回転できる最大角度 per秒を定義します。
UIDragSpeedAxisMapping検出器の **** に基づいて、 X / SelectionModeDragSpeed 次元のドラッグ速度を決定します。デフォルトは 、つまり X および Y 軸速度はそれぞれ X および Y の値に基づいています。代替は および で、両方の軸速度はそれぞれ X ( ) または Y ( ) の値が適用されます。代替は、それぞれの軸に対して引き続き適用されます。たとえば、最初の祖先 が 800×600 であり、 が である場合、 の設定は、 X / Y のドラッグ速度 / を生成し、 は、 / (両方の値は両方の場合と同じです)を生成します。

クリックとドラッグに対するスクリプトの応答

イベントシグナル、プロパティ変更、ドラッグスタイル、カスタム関数を通じて、スクリプトは、音楽とサウンド効果の音量を別々に調整するスライダーなど、ドラッグされたUI要素の操作に応答して、さまざまな設定を操作したり、論理的な決定を下したりすることができます。

イベントシグナル

次のイベントシグナルを通じて、ユーザーがオブジェクトをドラッグ開始、続行、および終了するときを検出できます。

イベント説明
DragStartユーザーがオブジェクトをドラッグ開始すると、発火します。
DragContinueユーザーが DragStart が開始された後もオブジェクトをドラッグ続行すると、ファイアが発生します。
DragEndユーザーがオブジェクトをドラッグ中止すると発火します。

次のスライダは、コンテナを BoundingUI として指定して、コンテナ領域内での移動を制限し、スケールベースの TranslateLine ドラッグを追加のスクリプトなしでコンテナ全幅に制限することがでスクリプト作成ます。

UIDragDetector - イベントシグナル透明度変更

-- 階層は、SliderContainer ⟩ ハンドル ⟩ 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 プロパティに変更を直接モニタリングできます。

次の検出器は、DragStyleRotate に設定し、ユーザーがハンドルを色調回転リングの周りにドラッグでき、すべての変更を検出しながら、Instance:GetPropertyChangedSignal() を通じてドラッグ回転を検出できます。

UIDragDetector - ドラッグ回転変更

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.DragStyleEnum.UIDragDetectorDragStyle.Scriptable に設定すると、入力位置の Vector2 を受け取り、UDim2 (位置) と浮動 (回転) を返す独自の機能を提供できます。探知器は、返回、DragSpace プロパティ、および DragRelativity プロパティに基づいて、オブジェクトを計算された位置/回転に更新します。

デフォルトでは、返された UDim2 と浮動は、検出器の親のローカルスペースで最終の 位置/回転 を達成するようになります。既存の翻訳/回転制限は、指定された BoundingUI インスタンスによって課される境界制限と同様に、引き続き適用されます。

次の例では、 X 座標入力の変更によって計算されたシンクロ波に続いて UI 要素をドラッグします。検出器の DragSpaceEnum.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.DragUDim2UIDragDetector.DragRotation を編集するためのカスタム制約関数を登録できます。たとえば、位置を特定の増分にラウンドしてグリッド上の動作を維持するか、動作可能な領域を定義することができます。これは、既存の翻訳/回転制限の前に 適用されることに注意してください

次の例では、プラナードラッグを行数と列数に基づいて X / Y グリッドにクランプする制約関数を使用しています。検出器の ResponseStyleEnum.UIDragDetectorResponseStyle.Scale に設定され、BoundingUI はグリッドコンテナに設定されていることに注意してください。

UIDragDetector - グリッドでドラッグ、タイルにスナップ

-- 階層は GridContainer ⟩ ハンドル ⟩ 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)