インスタンスは、ドアや引き出しを開いたり、部品をスライドしたり、ボウリングボールをつかんで投げたり、スリングショットを引っ張って発射したり、さらに多くのことを通じて、エクスペリエンス内の3Dオブジェクトとの相互作用を促進します。主な機能には以下があります:
任意の DragDetector または BasePart または Model の下に ドラッグ可能にする すべての入力 (マウス、タッチ、ゲームパッド、および VR) を通じてコード一行もなく配置します。
複数の ドラッグスタイル から選択し、オブジェクトがモーションにどのように応答するかを定義し、オプションで 軸または移動制限 を適用します。
スクリプトは、ドラッグされたオブジェクトの操作に応答して、UIをドライブするか、スライディングウォールスイッチダイマーに基づいて部屋の照明レベルを調整するなど、論理的な決定を下すことができます。
プレイヤーは固定されたパーツやモデルを操作でき、リリース時に置いた場所に正確に残ります。
DragDetectors 作業室では、 使用していない限り 、 選択 、 移動 、 スケール 、または 回転 ツールを使用しない限り、編集中にドラッグ可能なオブジェクトをテストし、調整するのが簡単になります。
オブジェクトをドラッグ可能にする
任意のパーツまたはモデルをドラッグ可能にするには、単に DragDetector を直接の子孫として追加します。
メニューから、 ドラッグディテクター を挿入します。
デフォルトでは、オブジェクトは地上平面でドラッグ可能になりますが、DragStyle をカスタマイズして、モーションにどのように応答するか を定義し、オプションで軸または移動制限を適用する ことができます。
ドラッグディテクタをカスタマイズする
スタイルをドラッグ
DragDetectors マップカーソル移動を仮想のラインとプレーンに移動し、提案された 3D 動作を計算します。DragStyle プロパティを通じて、ニーズに合わせて異なるマッピングから選択できます。たとえば、 TranslatePlane は、仮想プレーンで翻訳を生成し、 RotateAxis は、仮想プレーンに関する回転を生成します。
設定 | 説明 |
---|---|
TranslateLine | 検出器の Axis 沿いの 1D モーション、デフォルトでは世界の Y 軸。 |
TranslatePlane | 検出器の Axis に平行する飛行機の 2D 動作、デフォルトでは世界の XZ 飛行機。 |
TranslatePlaneOrLine | 2D モーションは、検出器の Axis と平行な平面で、修正子 が有効になっているとき、検出器の Axis 沿いの 1D モーション。 |
TranslateLineOrPlane | 検出器の Axis 沿いの 1D モーションと、修正子 が有効になっているとき、検出器の Axis 平面に対して 2D モーション。 |
TranslateViewPlane | カメラのビューと平行する飛行機の 2D 動作。このモードでは、飛行機はドラッグ中でも常に更新され、カメラの現在のビューに常に直面します。 |
RotateAxis | 検出器の Axis についての回転、デフォルトでは世界の Y 軸。 |
RotateTrackball | トラックボール回転、TrackballRadialPullFactor および TrackballRollFactor プロパティを通じてさらにカスタマイズ。 |
BestForDevice | TranslatePlaneOrLine マウスとゲームパッド用; TranslatePlane タッチ用; 6DOF VR用。 |
Scriptable | カスタム関数を通じて提供される SetDragStyleFunction() を介して、希望する動作を計算します。 |
方向をドラッグ
デフォルトでは、3D モーションと関連する DragStyle マップをワールドスペースにマップします。ただし、ドラッグ検出器をビルドするときなど、 、 、または など、例えば調整可能なパーツを持つモデルに変更したい場合があります。
性質 | 説明 | デフォルト |
---|---|---|
ReferenceInstance | ピボットがドラッグディテクターの 参照フレーム を提供するインスタンス。The DragFrame は、GetReferenceFrame() を介して回収できるこの参照フレームに対して表現されます。参照フレームが nil である場合、翻訳は世界空間の Axis プロパティに対して、または平行する平面に向かって行われます。 | nil |
Orientation | 参照フレームに対する運動軸の回転 YXZ を指定します (参照フレーム自体の向きを変更しません)。線形翻訳と軸回転は、この再定向 Y 軸にあり、平面翻訳は XZ 平面にあります。この値を自動的に変更すると、Axis が更新され、その逆も同様です。 | (0, 0, 0) |
Axis | 参照フレームに対して表現される主軸の動作。この値を変更すると、自動的に Orientation が更新されます。 | (0, 1, 0) |
モーションへの応答
ResponseStyle プロパティは、オブジェクトが Anchored かどうかに応じて、提案された動作に対してオブジェクトがどのように応答するかを指定します。
設定 | 固定された動作 | 未固定動作 |
---|---|---|
Geometric | 実行中のエクスペリエンスとスタジオの編集モードの両方で、アンカー付きオブジェクトの位置/方向は、提案された動作を正確に反映するように更新されます。 | 未固定オブジェクトの場合、動作はアンカー付きオブジェクトと同じです。しかし、実行中のエクスペリエンスでは、オブジェクトはドラッグの開始時にアンカーされ、ドラッグリリース時にアンカー解除されます。 |
Physical | アンカー付きオブジェクトは、力に影響を受けないため、デフォルトで 幾何学的 動作になります。 | 未固定オブジェクトは、提案された動作によって指定された位置と/または方向に移動される 制約力 によって移動されます。 |
Custom | オブジェクトはまったく動かないが、 は引き続き更新され、好きなようにドラッグ操作に応答できる。 | (同じく固定済み) |
軸と移動制限
デフォルトでは、DragStyle の内在的な制限を超えて 3D モーションに制限はありません。必要に応じて、翻訳と回転の両方に最小限と最大限を適用できます。注意してくださいが、これらは 制限ではありません 、単にドラッグ検出器の動作を生成しようとする試みを妨げるだけで、制限内に留まります。
属性 | 説明 | デフォルト |
---|---|---|
MinDragTranslation MaxDragTranslation | 各次元でドラッグ翻訳の制限。MaxDragTranslation が MinDragTranslation より大きい場合、翻訳はその範囲内に収まります。 | (0, 0, 0) |
MinDragAngle MaxDragAngle | 関連しているのは、DragStyle が RotateAxis に設定されている場合のみです。If MaxDragAngle が MinDragAngle より大きい場合、回転はその範囲内に制限されます。 | 0 |
許可をドラッグ
プレイヤーが特定のドラッグディテクターインスタンスと対話する権限は、PermissionPolicy プロパティで指定できます。これはデフォルトで Enum.DragDetectorPermissionPolicy.Everybody に設定され、コードサンプルに示されたようにスクリプトで許可制御をサポートするように変更することもできます。
設定 | 説明 |
---|---|
Nobody | プレイヤーは DragDetector と対話できません。 |
Everybody | すべてのプレイヤーが DragDetector と対話できます。 |
Scriptable | プレイヤーのドラッグ許可は、SetPermissionPolicyFunction() を通じて登録された関数によって決定されます。この設定では、機能を登録したり、無効な結果を返したりすることにより、すべてのプレイヤーがドラッグできなくなります。 |
ドラッグディテクタ - スクリプトでドラッグ許可を取得
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)
物理反応
ドラッガーの応答スタイルが 物理 に設定され、未固定オブジェクトに適用されると、そのオブジェクトは提案された動作によって指定された位置/方向に移動されます。次のプロパティを通じて物理応答をさらにカスタマイズできます:
性質 | 説明 | デフォルト |
---|---|---|
ApplyAtCenterOfMass | 偽りの場合、クリックしたポイントにドラッグフォースが適用されます。真実の場合、力はオブジェクトの質量の中心に適用されます。 | 偽 |
MaxForce | オブジェクトが目標に到達するために適用される最大力。 | 10000000 |
MaxTorque | オブジェクトが目標に到達するために適用される最大トルク。 | 10000 |
Responsiveness | より高い値は、オブジェクトが目標により迅速に到達するようにします。 | 10 |
修正者入力
いくつかの DragStyle モードでは、ユーザーが 修正子 キー/ボタンを長押しして、ドラッグされたオブジェクトを異なる方法で操作できます。デフォルトでは、修正者は PC で LeftControl、ゲームパッドで ButtonR1、または VR で ButtonL2 です。ドラッグディテクターインスタンスの KeyboardModeSwitchKeyCode 、 GamepadModeSwitchKeyCode 、または VRSwitchKeyCode プロパティを通じて、これらの修正子をカスタマイズできます。
レプリケーション
RunLocally プロパティが false (デフォルト) の場合、クライアントはすべての入力を解釈し、サーバーに送信してドラッグを実行するデータを生成します。このモードでは、すべてのカスタムイベントシグナルと登録された機能がサーバー Scripts にある必要があります。
RunLocally プロパティが真になると、サーバーにイベントは複製されません。すべてのカスタムイベントシグナルと登録された機能は、クライアント LocalScripts にある必須であり、サーバーに必要な変更を拡散するには リモートイベント を使用する必要があります。
クリックとドラッグに対するスクリプトの応答
イベントシグナル、プロパティ変更、ドラッグスタイル、カスタム関数を通じて、スクリプトはドラッグされたオブジェクトの操作に応答し、UIをドライブしたり、スライディングウォールスイッチダイマーに基づいて部屋の明るさレベルを調整したり、論理的な決定を下したりすることができます。
イベントシグナル
次のイベントシグナルを通じて、ユーザーがオブジェクトをドラッグ開始、続行、および終了するときを検出できます。
イベント | 説明 |
---|---|
DragStart | ユーザーがオブジェクトをドラッグ開始すると、発火します。 |
DragContinue | ユーザーが DragStart が開始された後もオブジェクトをドラッグ続行すると、ファイアが発生します。 |
DragEnd | ユーザーがオブジェクトをドラッグ中止すると発火します。 |
ドラッグディテクタ - イベントシグナル
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 に対する変更を直接モニターできます。
ドラッグ検出器 - ドラッグフレームの変更
local dragDetector = script.Parent.DragDetector
dragDetector:GetPropertyChangedSignal("DragFrame"):Connect(function()
local currentDragTranslation = dragDetector.DragFrame.Position
print(currentDragTranslation)
end)
スクリプト化されたドラッグスタイル
検出器の DragStyle を スクリプト可能 に設定すると、Ray を受け取り、世界空間 CFrame を返す独自の機能を提供できます。探知器は、動作を移動してドラッグされたオブジェクトがそのカスタムロケーション/オリエンテーションに移動します。
ドラッグディテクタ - スクリプトされたドラッグスタイル
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 を適用する前に、カスタム制約関数を登録して検出器を編集できます。たとえば、位置をグリッド増分の倍数に丸めてグリッド上に動作を維持するか、各ピースに適用される動作規則でチェスゲームをシミュレートすることができます。
ドラッグディテクタ - カスタム制約機能
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)
-- When applicable, remove the constraint function by invoking connection:Disconnect()
例の使用
未固定の物理オブジェクト
ドラッグディテクターの基本的な実装は、プレイヤーが注意深くピースを削除し、塔を正しく保つように試みるタワーバランスゲームです。次のタワー構造では、各部品にはデフォルトの で TranslatePlane の子があるので、プレイヤーが部品を外向きに引き出すことができますが、上向きや下向き、または横向きではありません。
調整可能なパーツで固定モデル Anchored models with adjustable parts
主に固定されているが、プレイヤーがドラッグできる子部品/モデルが 1つ以上あるモデルを簡単に作成し、共有できます。たとえば、次のデスクには、プレイヤーが開いて内部を調べることができる2つの引き出しがあります。
検出器と制限をドラッグする
ドラッグ探知器を Constraints と組み合わせることができます、例えばマリオネットのパペットです。次の設定では、コントロールハンドルが固定され、ボディパーツは固定されず、制限がマリオネットを一緒に保持します。ハンドルを TranslateViewPlane で移動し、DragStyle でマリオネットが踊り、個々の身体部位もドラッグディテクターで移動でき、モデルの完全性が維持されます。
3D ユーザーインターフェイス
3D ユーザーインターフェイスは、スライディングスイッチダイマーに基づいて SpotLight の明るさを調整するなどのドラッグ検出器を通じて簡単に達成できます。また、 X と Z 軸を個別に検出して、3Dユーザーインターフェイスの異なる2つの側面を制御できます。例えば、Size、Speed、およびColorのParticleEmitter。
ドラッグディテクタ - 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)