3Dドラッグ検出器

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

DragDetectorインスタンスは、ゲーム内の3Dオブジェクトとのインタラクションを促進し、奨励します。たとえば、ドアや引き出しを開けたり、パーツをスライドさせたり、ボウリングボールをつかんで投げたり、スリングショットを引いて発射したり、その他多くのことが可能です。主な機能は以下の通りです。

  • 任意のBasePartまたはModelの下にDragDetectorを配置することで、すべての入力(マウス、タッチ、ゲームパッド、VR)を介してドラッグ可能にすることができます。これを行うのに、コードは一行も必要ありません。

  • いくつかのドラッグスタイルから選択し、オブジェクトが動きに応じて反応する方法を定義し、オプションで軸または動きの制限を適用できます。

  • スクリプトは、ドラッグされたオブジェクトの操作に反応することができ、UIを駆動したり、スライド式の壁スイッチの調光に基づいて部屋の明るさを調整するなどの論理的な決定を行うことができます。

  • プレイヤーは、固定されたパーツやモデルを操作でき、リリース時にちょうど置いた場所に留まります。

  • DragDetectorsは、SelectMoveScale、またはRotateツールを使用していない限り、Studioで動作します。これにより、編集中にドラッグ可能なオブジェクトをテストおよび調整しやすくなります。

オブジェクトをドラッグ可能にする

任意のパーツまたはモデルをドラッグ可能にするには、単にDragDetectorを直接の子として追加します。

  1. Explorerウィンドウで、PartMeshPart、またはModelにカーソルを合わせ、⊕ボタンをクリックします。コンテキストメニューが表示されます。

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

  3. デフォルトでは、オブジェクトは地面の平面でドラッグ可能になりますが、DragStyleをカスタマイズし、動きに応じて反応する方法を定義し、オプションで軸または動きの制限を適用できます。

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

ドラッグスタイル

DragDetectorsは、カーソルの動きを仮想の線や平面にマッピングして提案された3Dの動きを計算します。DragStyleプロパティを通じて、ニーズに応じたさまざまなマッピングから選択できます。たとえば、TranslatePlaneは仮想平面での移動を生成し、RotateAxisは仮想軸の周りの回転を生成します。

設定説明
TranslateLine検出器のAxisに沿った1Dの動き。デフォルトでは、ワールドのY軸です。
TranslatePlane検出器のAxisに垂直な平面内での2Dの動き。デフォルトでは、ワールドのXZ平面です。
TranslatePlaneOrLine検出器のAxisに垂直な平面内での2Dの動きと、修飾子がアクティブな場合の検出器のAxisに沿った1Dの動き。
TranslateLineOrPlane検出器のAxisに沿った1Dの動きと、修飾子がアクティブな場合の検出器のAxisに垂直な平面内での2Dの動き。
TranslateViewPlaneカメラの視点に垂直な平面内での2Dの動き。このモードでは、平面はドラッグ中も常に更新され、カメラの現在の視点を常に向きます。
RotateAxis検出器のAxisの周りの回転。デフォルトでは、ワールドのY軸です。
RotateTrackballトラックボール回転。TrackballRadialPullFactorおよびTrackballRollFactorプロパティを通じてさらにカスタマイズされます。
BestForDeviceマウスとゲームパッド用にTranslatePlaneOrLine、タッチ用にTranslatePlane、VR用に6DOF
ScriptableSetDragStyleFunction()を通じて提供されたカスタム関数を使用して、希望する動きを計算します。

ドラッグ方向

デフォルトでは、3Dの動きと関連するDragStyleはワールド空間にマッピングされます。ただし、ReferenceInstanceOrientation、またはAxisを変更したい場合があります。たとえば、調整可能なパーツを持つモデルにドラッグ検出器を組み込む場合です。

プロパティ説明デフォルト
ReferenceInstanceドラッグ検出器の参照フレームを提供するピボットを持つインスタンス。DragFrameは、この参照フレームに対して表現され、GetReferenceFrame()を通じて取得できます。参照フレームがnilの場合、翻訳はワールド空間のAxisプロパティの方向(またはその平面)になります。nil
Orientation参照フレームに対する動きの軸のYXZ回転を指定します(参照フレーム自体の向きは変更しません)。線形翻訳と軸回転は、この再指向されたY軸上で行われ、平面内の翻訳はXZ平面で行われます。この値を変更すると、Axisが自動的に更新され、その逆も同様です。(0, 0, 0)
Axis参照フレームに対して表現される主な動きの軸。この値を変更すると、Orientationが自動的に更新され、その逆も同様です。(0, 1, 0)

動きに対する反応

ResponseStyleプロパティは、オブジェクトが提案された動きにどのように反応するかを指定します。オブジェクトがAnchoredかどうかによって異なります。

設定固定された動作固定されていない動作
Geometric実行中のゲームとStudio編集モードの両方で、固定されたオブジェクトの位置/向きは、提案された動きを正確に反映するように更新されます。固定されていないオブジェクトの場合、動作は固定されたオブジェクトと同じです。ただし、実行中のゲームでは、オブジェクトはドラッグの開始時に固定され、ドラッグをリリースすると固定されていない状態に戻ります。
Physical固定されたオブジェクトは、力の影響を受けないため、デフォルトでGeometric動作になります。固定されていないオブジェクトは、提案された動きによって与えられた位置や向きに持っていこうとする制約力によって移動されます。
Customオブジェクトは全く動かず、DragFrameは引き続き更新され、ドラッグ操作に反応することができます。(固定された場合と同じ)

軸と動きの制限

デフォルトでは、DragStyleの固有の制限を超えて、3Dの動きに制限はありません。必要に応じて、翻訳と回転の両方に最小および最大の制限を適用できます。ただし、これらは制約ではなく、制限内に留まるためにドラッグ検出器の動きの生成を妨げるだけです。

プロパティ説明デフォルト
MinDragTranslation
MaxDragTranslation
各次元でのドラッグ翻訳の制限。MaxDragTranslationがMinDragTranslationより大きい場合、翻訳はその範囲内に制限されます。(0, 0, 0)
MinDragAngle
MaxDragAngle
DragStyleRotateAxisに設定されている場合にのみ関連します。MaxDragAngleMinDragAngleより大きい場合、回転はその範囲内に制限されます。0

ドラッグ権限

プレイヤーが特定のドラッグ検出器インスタンスとインタラクションする権限は、PermissionPolicyプロパティで指定できます。デフォルトではEnum.DragDetectorPermissionPolicy.Everybodyに設定されており、コードサンプルに示すようにスクリプトによる権限制御をサポートするように変更できます。

設定説明
NobodyプレイヤーはDragDetectorとインタラクションできません。
EverybodyすべてのプレイヤーがDragDetectorとインタラクションできます。
Scriptableプレイヤーのドラッグ権限は、SetPermissionPolicyFunction()を通じて登録された関数によって決定されます。この設定では、関数を登録しなかったり、無効な結果を返したりすると、すべてのプレイヤーがドラッグできなくなります。
DragDetector - スクリプトによるドラッグ権限
local dragDetector = script.Parent.DragDetector
dragDetector.PermissionPolicy = Enum.DragDetectorPermissionPolicy.Scriptable
dragDetector:SetPermissionPolicyFunction(function(player, part)
if player and player:GetAttribute("IsInTurn") then
return true
elseif part and not part:GetAttribute("IsDraggable") then
return false
else
return true
end
end)

物理的反応

ドラッグの反応スタイルPhysicalに設定され、固定されていないオブジェクトに適用されると、そのオブジェクトは提案された動きによって与えられた位置/向きに持っていこうとする制約力によって移動されます。物理的反応は、以下のプロパティを通じてさらにカスタマイズできます。

プロパティ説明デフォルト
ApplyAtCenterOfMassfalseの場合、ドラッグ力はユーザーがクリックしたポイントで適用されます。trueの場合、力はオブジェクトの重心で適用されます。false
MaxForceオブジェクトが目標に到達するために適用される最大の力。10000000
MaxTorqueオブジェクトが目標に到達するために適用される最大のトルク。10000
Responsiveness値が高いほど、オブジェクトは目標により迅速に到達します。10

修飾子入力

一部のDragStyleモードでは、ユーザーが修飾子キー/ボタンを押し続けることで、ドラッグされたオブジェクトを異なる方法で操作できます。デフォルトでは、修飾子はPCではLeftControl、ゲームパッドではButtonR1、VRではButtonL2です。これらの修飾子は、ドラッグ検出器インスタンスのKeyboardModeSwitchKeyCodeGamepadModeSwitchKeyCode、またはVRSwitchKeyCodeプロパティを通じてカスタマイズできます。

レプリケーション

RunLocallyプロパティがfalse(デフォルト)の場合、クライアントはすべての入力を解釈して、サーバーに送信するデータを生成し、ドラッグを実行します。このモードでは、すべてのカスタムイベント信号と登録された関数はサーバーのScriptsに存在する必要があります。

RunLocallyプロパティがtrueの場合、イベントはサーバーにレプリケートされません。すべてのカスタムイベント信号と登録された関数はクライアントのLocalScriptsに存在する必要があり、必要な変更をサーバーに伝播させるためにリモートイベントを使用する必要があります。

クリックおよびドラッグに対するスクリプトの反応

イベント信号、プロパティの変更、Scriptableドラッグスタイル、およびカスタム関数を通じて、スクリプトはドラッグされたオブジェクトの操作に反応してUIを駆動したり、スライド式の壁スイッチの調光に基づいて部屋の明るさを調整するなどの論理的な決定を行うことができます。

イベント信号

以下のイベント信号を通じて、ユーザーがオブジェクトのドラッグを開始、継続、終了したときに検出できます。

イベント説明
DragStartユーザーがオブジェクトのドラッグを開始したときに発火します。
DragContinueユーザーがDragStartが開始された後にオブジェクトのドラッグを続けているときに発火します。
DragEndユーザーがオブジェクトのドラッグを停止したときに発火します。
DragDetector - イベント信号
local dragDetector = script.Parent.DragDetector
local highlight = Instance.new("Highlight")
highlight.Enabled = false
highlight.Parent = script.Parent
dragDetector.DragStart:Connect(function()
highlight.Enabled = true
end)
dragDetector.DragContinue:Connect(function()
end)
dragDetector.DragEnd:Connect(function()
highlight.Enabled = false
end)

ドラッグフレームの変更

イベント信号に加えて、検出器のDragFrameの変更を直接監視できます。

DragDetector - DragFrameの変更
local dragDetector = script.Parent.DragDetector
dragDetector:GetPropertyChangedSignal("DragFrame"):Connect(function()
local currentDragTranslation = dragDetector.DragFrame.Position
print(currentDragTranslation)
end)

スクリプトによるドラッグスタイル

検出器のDragStyleScriptableに設定すると、Rayを受け取り、ワールド空間のCFrameを返す独自の関数を提供できます。検出器は、ドラッグされたオブジェクトがそのカスタム位置/向きに移動するように動きを調整します。

DragDetector - スクリプトによるDragStyle
local Workspace = game:GetService("Workspace")
local dragDetector = script.Parent.DragDetector
dragDetector.DragStyle = Enum.DragDetectorDragStyle.Scriptable
local cachedHitPoint = Vector3.zero
local cachedHitNormal = Vector3.yAxis
local function followTheCursor(cursorRay)
-- ドラッグされたオブジェクトをレイキャスト検出から除外
local raycastParams = RaycastParams.new()
raycastParams.FilterDescendantsInstances = {dragDetector.Parent}
raycastParams.FilterType = Enum.RaycastFilterType.Exclude
local hitPoint = Vector3.zero
local hitNormal = Vector3.yAxis
local raycastResult = Workspace:Raycast(cursorRay.Origin, cursorRay.Direction, raycastParams)
if raycastResult then
hitPoint = raycastResult.Position
hitNormal = raycastResult.Normal.Unit
else
hitPoint = cachedHitPoint
hitNormal = cachedHitNormal
end
cachedHitPoint = hitPoint
cachedHitNormal = hitNormal
local lookDir1 = hitNormal:Cross(Vector3.xAxis)
local lookDir2 = hitNormal:Cross(Vector3.yAxis)
local lookDir = if lookDir1.Magnitude > lookDir2.Magnitude then lookDir1.Unit else lookDir2.Unit
return CFrame.lookAt(hitPoint, hitPoint + lookDir, hitNormal)
end
dragDetector:SetDragStyleFunction(followTheCursor)

カスタム制約関数

ドラッグ検出器には、グリッドやスナッピングに関する組み込みの動きのルールはありませんが、ドラッグ検出器のDragFrameが適用される前に編集するためのカスタム制約関数を登録できます。たとえば、位置をグリッドの増分の倍数に丸めることで動きをグリッドに保ったり、各ピースの動きのルールに従ってチェスゲームをシミュレートしたりできます。

DragDetector - カスタム制約関数
local dragDetector = script.Parent.DragDetector
local startPartPosition = nil
local SNAP_INCREMENT = 4
dragDetector.DragStart:Connect(function()
startPartPosition = script.Parent.Position
end)
dragDetector.DragEnd:Connect(function()
startPartPosition = nil
end)
local function snapToWorldGrid(proposedMotion)
if startPartPosition == nil then
return proposedMotion
end
local snapIncrement = SNAP_INCREMENT // 1
if snapIncrement < 1 then
return proposedMotion
end
local newWorldPosition = startPartPosition + proposedMotion.Position
local roundedX = ((newWorldPosition.X / snapIncrement + 0.5) // 1) * snapIncrement
local roundedY = ((newWorldPosition.Y / snapIncrement + 0.5) // 1) * snapIncrement
local roundedZ = ((newWorldPosition.Z / snapIncrement + 0.5) // 1) * snapIncrement
local newRoundedWorldPosition = Vector3.new(roundedX, roundedY, roundedZ)
return proposedMotion.Rotation + (newRoundedWorldPosition - startPartPosition)
end
local connection = dragDetector:AddConstraintFunction(2, snapToWorldGrid)
-- 適用可能な場合、connection:Disconnect()を呼び出して制約関数を削除します。

使用例

固定されていない物理オブジェクト

ドラッグ検出器の基本的な実装は、プレイヤーが慎重にピースを取り除き、タワーを直立させようとするタワーバランスゲームです。以下のタワー構造では、各ピースに子としてDragDetectorがあり、デフォルトのDragStyleTranslatePlaneで、プレイヤーはピースを外側に引っ張ることができますが、上や下には引っ張れません。

調整可能なパーツを持つ固定モデル

主に固定されているが、プレイヤーがドラッグできる1つ以上の子パーツ/モデルを持つモデルを簡単に作成して共有できます。たとえば、以下のデスクには、プレイヤーが中を確認するために開けることができる2つの引き出しがあります。

ドラッグ検出器と制約

ドラッグ検出器をConstraintsと組み合わせることができます。たとえば、マリオネットの人形です。以下のセットアップでは、制御ハンドルが固定され、体の部分が固定されておらず、制約がマリオネットを保持します。TranslateViewPlane DragStyleを使用してハンドルを移動させると、マリオネットが踊り、個々の体の部分もドラッグ検出器で移動でき、モデルの整合性が保たれます。

3Dユーザーインターフェース

3Dユーザーインターフェースは、ドラッグ検出器を使用することで簡単に実現できます。たとえば、スライド式のスイッチの調光に基づいてSpotLightの明るさを調整することができます。また、XおよびZ軸を個別に検出して、SizeSpeed、およびColorなど、3Dユーザーインターフェースの2つの異なる側面を制御できます。

DragDetector - 3Dユーザーインターフェース
local model = script.Parent
local slider = model.SliderPart
local originPart = model.OriginPart
local emitter = script.Parent.EmitterPart.ParticleEmitter
local dragDetector = slider.DragDetector
dragDetector.ReferenceInstance = originPart
dragDetector.MinDragTranslation = Vector3.zero
dragDetector.MaxDragTranslation = Vector3.new(10, 0, 10)
local dragRangeX = dragDetector.MaxDragTranslation.X - dragDetector.MinDragTranslation.X
local dragRangeZ = dragDetector.MaxDragTranslation.Z - dragDetector.MinDragTranslation.Z
local MIN_PARTICLE_SIZE = 1
local MAX_PARTICLE_SIZE = 1.5
local MIN_PARTICLE_SPEED = 2.5
local MAX_PARTICLE_SPEED = 5
local COLOR1 = Color3.fromRGB(255, 150, 0)
local COLOR2 = Color3.fromRGB(255, 0, 50)
local function updateParticles(emitter)
local dragFactorX = (dragDetector.DragFrame.Position.X - dragDetector.MinDragTranslation.X) / dragRangeX
local dragFactorZ = (dragDetector.DragFrame.Position.Z - dragDetector.MinDragTranslation.Z) / dragRangeZ
-- ドラッグ検出器のXファクターに基づいてパーティクルのサイズと速度を調整
emitter.Size = NumberSequence.new{
NumberSequenceKeypoint.new(0, 0),
NumberSequenceKeypoint.new(0.1, MIN_PARTICLE_SIZE + ((MAX_PARTICLE_SIZE - MIN_PARTICLE_SIZE) * dragFactorX)),
NumberSequenceKeypoint.new(1, 0)
}
local speed = MIN_PARTICLE_SPEED + ((MAX_PARTICLE_SPEED - MIN_PARTICLE_SPEED) * dragFactorX)
emitter.Speed = NumberRange.new(speed, speed * 1.2)
-- ドラッグ検出器のZファクターに基づいてパーティクルの色を調整
local color = COLOR2:Lerp(COLOR1, dragFactorZ)
emitter.Color = ColorSequence.new{
ColorSequenceKeypoint.new(0, color),
ColorSequenceKeypoint.new(1, color)
}
end
dragDetector:GetPropertyChangedSignal("DragFrame"):Connect(function()
updateParticles(emitter)
end)
©2026 Roblox Corporation。Roblox(ロブロックス)、RobloxロゴおよびPowering Imaginationは、米国並びにその他の国における登録商標および非登録商標です。