Class.DragDetector インスタンスは、ドアや引き出しを開くなど、エクスペリエンスで 3D オブジェクトとの交流を容易にし、促進します。キー機能には、Class.DragDetector を含みます:
プレイヤーはアンカー部品やモデルを操作できますが、リリース時に正確に配置した場所に保持されます。
Class.DragDetector|DragDetectors は Studio で作動し、 選択 、 移動 、0> スケール0>、または DragDetectors3> ツールを使用していない限り、ドラッグ可能なオブジェクトをテストして調整しやすくします。
オブジェクトをドラッグ可能にする
任意のパーツまたはモデルをドラッグ可能にするには、DragDetector を直接の子として追加します。
メニューから ドラッグディテクター を挿入します。
デフォルトでは、オブジェクトは地上の飛行機にドラッグできますが、DragStyle 、モーションに応答する方法 、およびオプションで軸または移動制限を適用することができます。
ドラッグ検知機をカスタマイズする
ドラッグスタイル
DragDetectors マップカーソルの動きをバーチャルラインと飛行機を計算するために変更します。通過する DragStyle プロパティで、必要に応じて異なるマッピングを選択できます。たとえ
設定 | 説明 |
---|---|
TranslateLine | 1D モーション、Axis のディフォルトで世界の Y 軸。 |
TranslatePlane | 2D モーションは、Axis に対して、ディフォルトでは世界の XZ 平面です。 |
TranslatePlaneOrLine | 探知機の Axis に沿って、飛行機の 2D モーション、および、変更者 が有効になったときの 1D モーションを、ディテクターの Axis に沿って移動させる。 |
TranslateLineOrPlane | 1D モーションは、Axis のディテクターの 5D モーション、および、Axis がアクティブなときの 2D モーションです。 |
TranslateViewPlane | 2D モーションは、カメラのビューに平行してプレーン内の移動です。このモードでは、飛行機は常にドラッグしている状態で更新され、カメラのビューに常に面します。 |
RotateAxis | 探知器の Axis の回転、デフォルトでは世界の Y 軸。 |
RotateTrackball | トラックボールの回転、TrackballRadialPullFactor と TrackballRollFactor プロパティを通じて、さらにカスタマイズされます。 |
BestForDevice | TranslatePlaneOrLine マウスとゲームパッドの場合; TranslatePlane タッチの場合; 6DOF VR の場合。 |
Scriptable | カスタム関数を通じて、SetDragStyleFunction() を通じて欲しい動作を計算します。 |
方向をドラッグ
デフォルトでは、3D モーションと関連する DragStyle マップをワールドスペースに。しかし、ReferenceInstance、Orientation
プロパティ | 説明 | デフォルト |
---|---|---|
ReferenceInstance | ドラッグディテクターのためのピボットを提供するインスタンス。Class.DragDetector.DragFrame|DragFrame は、DragFrame を通じて取得できるドラッグディ | nil |
Orientation | 参照フレームに対する YXZ 回転を指定します (参照フレーム自体のオリエントエリングを変更しません)。 ライニアルな変換と軸回りの回転は、この Y 軸の上のライン X 平面で行われます。この | (0, 0, 0) |
Axis | モーションの主軸は、参照フレームに対して相対的に表示されます。この値を変更すると、Orientation と逆に、更新されます。 | (0, 1, 0) |
モーションに対応するレポート
Class.DragDetector.ResponseStyle|ResponseStyle プロパティは、オブジェクトが Anchored であるかどうかに応じて、オブジェクトがプロポーションされた動きにどのように返信するかを指定します。
設定 | 固定された動作 | アンアンチャードビーハブ |
---|---|---|
Geometric | 実行中のエクスペリエンスと Studio 編集モードの両方で、アンカーオブジェクトの位置/オリエンテーションが正確に提案された動きに反映されます。 | 非アンカーオブジェクトの場合、動作はアンカーオブジェクトと同じです。ただし、実行中のエクスペリエンスでは、オブジェクトはドラッグの開始時にアンカーされ、ドラッグリリース後にアンカーされます。 |
Physical | アンカーオブジェクトは、 幾何学 動作にデフォルトします。これは、力に影響を受けないためです。 | アンカーされていないオブジェクトは、制限フォース によって移動されます。これは、プロポーションの指定された位置と/または方向に移動するようにします。 |
Custom | オブジェクトは動くことはありませんが、DragFrame はまだ更新され、ドラッグ操作に応答する ができます。 | (同じように錠定されています) |
アクスと移動の制限
デフォルトでは、DragStyle の内在する制限を超える 3D モーションには制限がありません。必要に応じて、Class.DragDetector.DragStyle とClass.DragDetector.DragStyle の両方に最小限と最大限を適用できます。ただし、これらは2>制限2>ではありま
プロパティ | 説明 | デフォルト |
---|---|---|
Class.DragDetector.MinDragTranslation|MinDragTranslation``Class.DragDetector.MaxDragTranslation|MaxDragTranslation | 各次元で翻訳をドラッグする制限があります。MaxDragTranslation が MinDragTranslation より大きい場合、翻訳はその範囲内にクリップされます。 | (0, 0, 0) |
Class.DragDetector.MinDragAngle|MinDragAngle``Class.DragDetector.MaxDragAngle|MaxDragAngle | Class.DragDetector.DragStyle|DragStyle が RotateAxis に設定されている場合にのみ関連します。MaxDragAngle が 1>Class.DragDetector.MinDragAngle|MinDragAngle1> より大きい場合、回転はその範囲内に押し込まれます。 | 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)
物理の応答
ドラガーの レポートスタイル は 物理 に設定され、アンカーオブジェクトに適用されます。そのオブジェクトは、物理 の位置/方向に指定された位置に移動されるように、2>制限フォース2> によって移動されます。5>物理5> のレポートをカスタマイズするには
プロパティ | 説明 | デフォルト |
---|---|---|
ApplyAtCenterOfMass | ユーザーがクリックするポイントで、ドラッグフォースを適用します。ユーザーがクリックするポイントで、フォースをオブジェクトの中心に適用します。 | 偽 |
MaxForce | オブジェクトが目標に到達するために適用される最大力。 | 10000000 |
MaxTorque | 目標に到達するために適用される最大トルク。 | 10000 |
Responsiveness | より高い値は、オブジェクトが目標に到達するのをより速くにさせます。 | 10 |
変更者の入力
レプリケーション
Class.DragDetector.RunLocally|RunLocally プロパティが偽である場合、クライアントは、ドラッグを実行するためにサーバーに送信するデータを生成します。このモードでは、すべてのカスタムイベントシグナルと登録された関数がサーバーに Scripts でなければなりません。
Class.DragDetector.RunLocally|RunLocally プロパティが true の場合、サーバーにイベントはレプリケートされません。すべてのカスタムイベントの信号と登録された関数は、クライアントの LocalScripts にあり、リモートイベント を使用して、必要な変更をサーバーに拡
クリックとドラッグに対するスクリプトのレポート
通過 イベント信号、プロパティの変更、 Scriptable ドラッグスタイル、およびカスタム関数、スクリプトは、ドラッグオブジェクトを操作して UI をドライブするか、またはスライドウォールのスイッチダイマーに基づくライトレベルを調整など、スクリプトを操作すること
イベント信号
次のイベント信号を通じて、ユーザーがオブジェクトをドラッグし始めたり、続けたり、終了したりするのを検出できます。
イベント | 説明 |
---|---|
DragStart | ユーザーがオブジェクトをドラッグし始めると、ファイアが発生します。 |
DragContinue | ユーザーが Class.DragDetector.DragStart|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)
スクリプト式ドラッグスタイル
Class.DragDetector.DragStyle|DragStyle をスクリプト可能に設定すると、 Datatype.Ray を入れて、世界スペースを返す Ray を提供できます。1> スクリプト可能に設定すると、ドラッグオブジェクトがそのカスタム位置/方向に移動するよ
DragDetector - スクリプトドラッグスタイル
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 を適用する前に、カスタムな制限機能を登録して、Class.DragDetector.DragFrame|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 = math.floor(SNAP_INCREMENT)
if snapIncrement < 1 then
return proposedMotion
end
local newWorldPosition = startPartPosition + proposedMotion.Position
local roundedX = math.floor(newWorldPosition.X / snapIncrement + 0.5) * snapIncrement
local roundedY = math.floor(newWorldPosition.Y / snapIncrement + 0.5) * snapIncrement
local roundedZ = math.floor(newWorldPosition.Z / snapIncrement + 0.5) * 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()
使用例
アンカーされていない物理オブジェクト
ドラッグディテクターの基本実装は、プレイヤーが部品を慎重に削除し、タワーを矮小化する必要があるドラッグスタイルゲームです。次のタワー構造では、各部品にデフォルトの Class.DragDetector.DragStyle|DragStyle の Class.DragDetector のドラッグスタイルを持つ子供
調整可能なパーツ付き錠定モデル
メインに固定されているが、プレイヤーがドラッグできる 1つまたは複数の子供部品/モデル があるモデルを簡単に作成し、共有できます。たとえば、次のデスクには 2つの引き出しがあり、プレイヤーが中に何があるかを確認できます。
探知機と制限をドラッグ
Class.DragDetector.DragStyle|DragStyle を使用して、マリオネットのパピオンを検出するためにドラッグディテクターと Class.Constructor|Constraints を組み合わせることができます。次の設定では、コントロールハンドルは��
3D ユーザーインターフェイス
3D ユーザーインターフェイスは、明るさを調整するなど、SpotLight 基にあるドラッグディテクタ
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)