3D 끌기 감지기

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

Class.DragDetector 인스턴스는 경험에서 3D 개체와 상호 작용을 촉진하고 장려하기 위해 도어와 서랍을 열고, 부품을 슬라이딩하고, 볼링 공을 그립고 던지고, 화살을 쏘고, 많은 기능을 포함합니다. 주요 기능은 다음과 같습니다.

  • 모든 입력(마우스, 터치, 게임 패드 또는 VR)에 대해 드래그 가능하도록 DragDetector를 배치하거나 BasePart 아래에 드래그 가능한 모든 장소를 드래그 가능하게 하는 하나의 코드 줄도 없이 드래그할 수 있습니다.

  • 여러 가지 드래그 스타일 중에서 선택하고, 개체가 이동에 대해 응답하는 방법을 정의하고, 선택적으로 축 또는 이동 제한을 적용합니다.

  • 스크립트는 드래그 개체의 조작에 응답하여 UI를 드라이브하거나 논리적 결정을 내릴 수 있습니다. 를 드라이브하거나 논리적 결정을 내리는 경우, 예를 들어 빛 수준을 조정하는 경우 슬라이딩 벽 스위치의 밝기 조정과 같은 로직 결정을 내릴 수 있습니다.

  • 플레이어는 고정된 부품이나 모델을 조작할 수 있으며, 해제 시 정확히 배치한 위치에 있습니다.

  • DragDetectors 작업은 Studio에서 드래그 탐지기를 사용하는 한 작동합니다. 선택하기 , 이동하기 , 0> 크기 조정하기0>, 또는 편집 중에 드래그 개체를 쉽게 테스트하고 조정할 수 있도록 로테이

개체를 드래그할 수 있게 하기

부품이나 모델을 드래그할 수 있도록 하려면 직접 후손으로 DragDetector를 추가하십시오.

  1. 탐색기 창에서 Class.Part, Part 또는 MeshPart 을 마우스로 이동하고 2>Class.Button2> 을 클릭하십시오. 컨텍스트 메뉴가 표시됩니다.

  2. 메뉴에서 드래그 감지기 를 삽입합니다.

  3. 기본적으로 이제 지상 평면에서 개체를 드래그할 수 있지만, DragStyle 을 사용자 정의하고, 이동에 대한 반응을 정의하고, 옵션으로 축이나 이동 한도를 적용할 수 있습니다.

드래그 감지기 사용자 정의

드래그 스타일

DragDetectors 가상 라인 및 평면으로 맵 커서 이동을 통해 제안된 3D 이동을 계산합니다. 통过 DragStyle 속성에서 다양한 맵을 선택할 수 있습니다. 예를

설정설명
TranslateLine1D 이동 경로는 감지기의 Axis 를 따라 이동하며, 기본적으로 세계 Y 축을 이동합니다.
TranslatePlane2D 이동 평면은 감지기의 Axis 에 대해 평면 위치에 있습니다. 기본적으로 세계 XZ 평면입니다.
TranslatePlaneOrLine2D 이동은 감지기의 Axis 및 모더라이저가 활성화된 경우 Class.DragDetector.Axis|Axis 와 함께, 감지기의 Axis 를 따라 1D 이동을 수행합니다.
TranslateLineOrPlane1D 이동 경로 및 감지기의 Axis 및, modifier 가 활성화된 경우, 평면 비행기의 평면 비행기의 평면 비행기의 평면 비행기의 평면 비행기의 평면 비행기의 평면 비행기의 평면 비행기의 평면 비행기의 평면 비행기의 평면 비행기의 평면 비행기
TranslateViewPlane2D 이동은 카메라의 뷰에 직각인 평면에서 수행됩니다. 이 모드에서는 평면이 항상 카메라의 현재 뷰를 향해 드래그되므로 항상 카메라의 뷰를 직접 맞출 수 있습니다.
RotateAxisClass.DragDetector.Axis|Axis 의 세계 축을 기본으로 하여 회전.
RotateTrackball트랙볼 로테이션, 추가 사용자 정의는 Class.DragDetector.TrackballRadialPullFactor|TrackballRadialPullFactor 및 Class.DragDetector.TrackballRollFactor|TrackballRadialPullFactor 속성을 통해 트랙볼 로테이션을 더 사용자 정의합니다.
BestForDevice 번역기 또는 라인 마우스 및 게임 패드용; 번역기 터치용; 6DOF VR용.
Scriptable계산 원하는 이동 방향을 사용자 정의 함수를 통해 SetDragStyleFunction() 를 통해 계산합니다.

방향 끌기

기본적으로 3D 모션 및 해당 맵은 세계 공간으로 이동합니다. 그러나 드래그 세이터를 변경하려면 DragStyle 맵을 참조하십시오. Class.DragDetector.ReferenceInstance

속성설명기본
ReferenceInstance드래그 감지기에 대한 참조 프레임을 제공하는 피벗이 있는 인스턴스입니다. 피벗은 다음과 같이 액세스할 수 있는 참조 프레임에 대해 익스프레스됩니다nil
Orientation참조 프레임( Y 포함)에 대한 축의 회전을 지정합니다( Y 축의 경우 참조 프레임 자체의 방향을 변경하지 않음). 직선 번역 및 축 회전은 이 재정렬 Y 축에 있으며, 평면(0, 0, 0)
Axis이 값은 참조 프레임에 대해 움직임의 주 축입니다. 이 값을 변경하면 Orientation 및 반대로 자동으로 업데이트됩니다.(0, 1, 0)

이동에 대한 응답

Class.DragDetector.ResponseStyle|ResponseStyle 속성은 개체가 Anchored 여부에 따라 제안된 운동에 어떻게 응답하는지 지정합니다.

설정고정 동작연결되지 않은 동작
Geometric실행 경험 내에서 앵커 개체의 위치/방향이 Studio 편집 모드에서 정확히 제안된 이동을 반영하도록 업데이트됩니다.앵커가 없는 개체의 경우 동작은 앵커가 있는 개체와 동일합니다. 그러나 실행 경험에서 개체는 끌기 시작 부분에 고정되며 끌기 해제 시 다시 고정됩니다.
Physical고정된 개체는 힘에 영향을 받지 않기 때문에 기하학적 동작으로 기본적으로 지정됩니다.고정되지 않은 개체는 제한 힘으로 이동하여 제안된 이동 방향과/또는 원하는 위치에 도착하려는 시도를 합니다.
Custom개체는 전체움직이지 않지만, DragFrame 은 여전히 업데이트되고 드래그 조작에 응답할 수 있지만, 드래그 조작에 응답하기 를 원하는 대로 수행할 수 있습니다.(앵커와 동일)

축 및 이동 제한

기본적으로 3D 이동은 DragStyle 의 내장 제한을 뛰어나지 않습니다. 필요한 경우 최소 및 최대 제한을 모두 번역 및 회전에 적용할 수 있습니다. 참고하십시오, 그러나 이는 제한이 아닙니다; 단지 이동 감지기가 생성하

속성설명기본
Class.DragDetector.MinDragTranslation|MinDragTranslation``Class.DragDetector.MaxDragTranslation|MaxDragTranslation각 차원에 대한 번역 제한. MaxDragTranslation이 MinDragTranslation보다 크면 번역이 해당 범위 내에 잘리게 됩니다.(0, 0, 0)
Class.DragDetector.MinDragAngle|MinDragAngle``Class.DragDetector.MaxDragAngle|MaxDragAngleClass.DragDetector.DragStyle|DragStyle 가 RotateAxis 로 설정된 경우에만 유용합니다. MaxDragAngle 이 1>Class.DragDetorer.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)

물리 응답

드래거의 응답 스타일 이 물리 로 설정되었으며 고정되지 않은 개체에 적용되므로 그 개체는 제약 힘으로 이동됩니다. 이 물리 응답을 사용자 정의하려면 다음 속성을 통해 자세히 사용자 정의할 수 있습니다.

속성설명기본
ApplyAtCenterOfMass사용자가 클릭하는 위치에 드래그 포스가 적용되면 사용자가 클릭한 위치에 드래그 포스가 적용됩니다. 사용자가 클릭하는 위치에 드래그 포스가 적용되면 드래그 포스가 개체의 중심 마스에 적용됩니다.없음
MaxForce목표에 도달하기 위해 적용된 최대 힘.10000000
MaxTorque목표에 도달하기 위해 적용된 최대 회전력.10000
Responsiveness값이 더 높을수록 개체가 목표에 도달하는 속도가 빨라집니다.10

모드 입력

복제

Class.DragDetector.RunLocally|RunLocally 속성이 기본(기본)인 경우 클라이언트는 모든 입력을 해석하여 서버에 전송하여 드래그를 수행하는 데 사용할 데이터를 생성합니다. 이 모드에서 모든 사용자 이벤트 신호 및 등록된 함수는 서버에 있어야 합니다 Scripts .

Class.DragDetector.RunLocally|RunLocally 속성이 진실로 되면 서버에 이벤트가 복제되지 않습니다. 모든 사용자 지정 이벤트 신호 및 등록된 함수는 클라이언트에 있어야 하며 LocalScripts 및 필요한 변경 사항을 서버에 전파하려면 원격 이벤트를 사용해

스크립트 클릭 및 드래그 응답

이벤트 신호를 통해 속성 변경, Scriptable 드래그 스타일, 사용자 지정 함수를 통해 끌어 오는 개체를 조작하여 UI를 드라이브하거나 논리적 결정을 내릴 수 있습니다. 예를 들어, 빛 수준을 조정하는 경우와 같이 드래그

이벤트 신호

다음 이벤트 신호를 통해 사용자가 개체를 드래그하기 시작하고 계속하고 끝내는 시간을 감지할 수 있습니다.

이벤트설명
DragStart사용자가 개체를 드래그하기 시작하면 화재됩니다.
DragContinueClass.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 을 반환합니다. 이 경우 드래그 개체가 해당 사용자 지정 위치/방향

드래그 디텍터 - 스크립트 드래그 스타일

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 = 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()

예시 사용

고정되지 않은 물리적 개체

드래그 감지기의 기본 구현은 플레이어가 조심스럽게 조각을 제거하고 타워를 견고하게 유지해야 하는 타워 밸런스 게임입니다. 다음 타워 구조에서 각 조각에는 기본적인 DragDetector 의 드래그 스타일

조정 가능한 부품이 있는 고정된 모델

주로 앵커가 있지만 플레이어가 드래그할 수 있는 하나 이상의 자식 부품/모델을 가진 모델을 쉽게 만들고 공유할 수 있습니다. 예를 들어, 다음 책상에는 플레이어가 열어서 내부를 검사할 수 있는 두 개의 서랍이 있습니다.

감지기 및 제약 사항 끌기

Class.Constructor|Seconds 와 같은 드래그 감지기를 Class.DragDetector.DragStyle|DragStyle 와 결합하여 마리오네트 인형을 예시로 들 수 있습니다. 다음 설정에서 컨트롤 핸들은 고정되고

3D 사용자 인터페이스

3D 사용자 인터페이스는 밝기 조정기와 같은 드래그 감지기를 통해 쉽게 액세스할 수 있습니다.

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)