3D Drag Cảm biến

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Các DragDetector instance facilitates and encourages interaction with 3D objects in an experience, such as opening doors and drawers, sliding a part around, grabbing and throwing a bowling ball, pulling back and firing a slingshot, và nhiều hơn nữa. Các tính năng chính bao gồm:

  • Đặt một DragDetector dưới bất kỳ BasePart hoặc Model nào để 1> làm cho nó trở nên kéo kéo1> qua tất cả các lực (chuột, chạm, gamepad và VR), tất cả mà không có dòng mã nào.

  • Chọn từ một loạt các kiểu kéo, xác định cách mà thể đối tượng phản ứng đối với chuyển động và áp dụng một số giới hạn trục hoặc di chuyển giới hạn .

  • Scripts có thể đáp lại sự thao tác của các đối tượng拖动 để lái UI hoặc đưa ra các quyết định hợp lý, chẳng hạn như điều chỉnh mức độ ánh sáng trong một phòng dựa trên nút bật/tắt của các cánh tay di chuyển.

  • Người chơi có thể thao tác vào các bộ phận hoặc mô hình đã gắn và chúng sẽ ở chính xác nơi bạn đặt chúng khi phát hành.

  • Class.DragDetector|DragDetectors hoạt động trong Studio miễn là bạn không sử dụng công cụ Chọn , Di chuyển , 0> Scale0> hoặc DragDetectors3> trong các công cụ khác, dễ dàng hơn để kiểm tra và điều chỉ

Làm cho đối tượng có thể kéo

Để làm cho bất kỳ phần hoặc mô hình có thể kéo, chỉ cần thêm một DragDetector như một tổ tiên trực tiếp.

  1. Trong Cửa sổ Explorer, hover over the Part , MeshPart , hoặc 1> Class.Model1> và nhấp vào nút ⊕. Một menu ng上下文 được hiển thị.

  2. Từ menu, insert a DragDetector .

  3. Mặc định, đối tượng giờ sẽ được kéo trên mặt đất, nhưng bạn có thể tùy chỉnh nó bằng cách DragStyle , định nghĩa cách nó phản ứng đối với chuyển động và áp dụng độ giới hạn trục hoặc chuyển động</

Tùy chỉnh các thiết bị dò kéo

Kiểu kéo

DragDetectors di chuyển màu mực map đến các mảng ảnh ảo để tính toán 3D đề xuất. Thông qua thuộc tính DragStyle , bạn có thể chọn từ các bản

Cài đặtMô tả
TranslateLine1D chuyển động theo trục Axis của thiết bị, bởi mặc định thế giới Y trục.
TranslatePlane2D motion in the plane perpendicular to the detector's Axis , by default the world XZ plane.
TranslatePlaneOrLine2D motion in the plane perpendicular to the detector's Axis and, when the modifier is active, 1D motion along the detector's Axis .
TranslateLineOrPlane1D motion theo chiều dọc của đầu dòng Axis và, khi modifier đang hoạt động, 2D motion trên máy bay theo hướng perpendicular đến đầu dòng của đầu dòng Class.DragDetector.Axis|Axis .
TranslateViewPlane2D motion trên máy bay theo hướng ngang trên camera. Ở chế độ này, máy bay được cập nhật liên tục, ngay cả khi kéo, và sẽ luôn mặt với cảnh nhìn hiện tại của camera.
RotateAxisXoay xung quanh trục Axis của máy dò địa vị, mặc định thế giới Y trục.
RotateTrackballTrackball rotation, further customized through the TrackballRadialPullFactor and TrackballRollFactor properties.
BestForDevice Dịch máy bay hoặc dòng dưới cho chuột và gamepad; Dịch máy bay cho chạm; 6DOF cho VR.
ScriptableTính toán chuyển động mong muốn thông qua chức năng tùy chỉnh cung cấp thông qua SetDragStyleFunction() .

Hướng Kéo

Bởi mặc định, 3D motion và map địa lý liên quan Class.DragDetector.DragStyle|DragStyle đến không gian thế giới. Tuy nhiên, bạn có thể muốn thay đổi Class.DragDetector.ReferenceInstance|ReferenceInstance ,

Thuộc tínhMô tảMặc định
ReferenceInstanceMột instância cuộn dịch cung cấp khung tham chiếu cho máy dò dịch. The DragFrame được biểu hiện bằng cách này có thể đượcnil
OrientationĐặt YXZ rotation of axes of motion relative to the reference frame (không thay đổi hướng của trụ cơ sở của hướng dẫn). Linear translation and axial rotation will be on this reorient Y axis, and planar translation in the XZ plane. Changing this value automatically updates 1> Class.DragDetector.Axis(0, 0, 0)
AxisTrục chính của chuyển động, biểu thị đối với khung tham chiếu. Thay đổi giá trị này tự động cập nhật Orientation và ngược lại.(0, 1, 0)

Phản hồi về chuyển động

Thuộc tính ResponseStyle xác định cách mà một đối tượng phản hồi với chuyển động đề xuất, tùy thuộc vào việc đối tượng đang ở Anchored hay không.

Cài đặtHành vi kết dínhHành vi không kết dính
GeometricỞ cả trong kinh nghiệm chạy và trong chế độ chỉnh sửa Studio, vị trí / hướng tương tác của một đối tượng bị kết bằng sẽ được cập nhật chính xác để phản ánh chuyển động đề xuất.Đối với một đối tượng không có mắc, hành vi là tương tự như đối tượng có mắc. Tuy nhiên, trong một trải nghiệm chạy, đối tượng sẽ được kết dính ở đầu của cuộn dịch và được kết dính lại ở đầu của cuộn dịch khi thả.
PhysicalMột đối tượng được kết bằng sẽ mặc định thành Hình học hành vi, vì nó không bị ảnh hưởng bởi các lực.Một đối tượng không có mắc dùng sức mạnh hạn chế để di chuyển nó đến vị trí và/hoặc hướng màu mà một chuyển động đề xuất đưa ra.
CustomĐối tượng sẽ không di chuyển at tất cả, but DragFrame vẫn sẽ được cập nhật and you can đáp lại sự thao tác kéo however you'd like.(tương tự như cắm)

Giới hạn về trục & di chuyển

Mặc dù không có giới hạn cho 3D motion ngoài những hạn chế tính năng của DragStyle . Nếu cần thiết, bạn có thể áp dụng giới hạn tối thiểu và tối đa cho cả hai translation và rotation. Ghi chú, tuy nhiên, rằng những

Tính chấtMô tảMặc định
Class.DragDetector.MinDragTranslation|MinDragTranslation``Class.DragDetector.MaxDragTranslation|MaxDragTranslationGiới hạn để kéo dịch vào mỗi chiều. Nếu MaxDragTranslation lớn hơn MinDragTranslation, dịch sẽ được kéo dài trong khoảng giới hạn đó.(0, 0, 0)
Class.DragDetector.MinDragAngle|MinDragAngle``Class.DragDetector.MaxDragAngle|MaxDragAngleChỉ liên quan nếu DragStyle được đặt ở RotateAxis . Nếu MaxDragAngle lớn hơn 1> Class.DragDetector.MinDragAngle|MinDragAngle1>, thì sự quay sẽ được kẹp trong phạm vi đ0

Rút tiền quyền

Chính sách cho phép người chơi tương tác với một instate thuỷ lực cụ thể có thể được quy định bởi thuộc tính PermissionPolicy . Điều này được thiết lập mặc định là Enum.DragDetectorPermissionPolicy.Everybody , và cũng có thể được th

Cài đặtMô tả
NobodyKhông ai có thể tương tác với DragDetector .
EverybodyTất cả người chơi có thể tương tác với DragDetector .
ScriptableCác quyền dịch chuyển của người chơi sẽ được xác định bởi một chức năng đã đăng ký qua SetPermissionPolicyFunction() . Dưới cài đặt này, sự thất bại trong việc đăng ký một chức năng hoặc trả kết quả không hợp lệ sẽ ngăn chặn tất cả người chơi k
DragDetector - Script quyền dịch chuyển

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)

Trả lời vật lý

Để cho phép một đối tượng kéo dài thân vào các thành phần cơ họa và phản hồi của nó, thì đối tượng đó sẽ được di chuyển bởi các lực kéo bởi hệ lực hạn chế đang cố gắng đưa nó đến vị trí/hướng định đư

Thuộc tínhMô tảMặc định
ApplyAtCenterOfMassKhi sai, thì dùng lực kéo ở điểm mà người dùng nhấp vào. Khi đúng, thì dùng lực ở trung tâm của đối tượng.đúng
MaxForceQuản lý tối đa sức mạnh để đạt được mục tiêu của mục tiêu.10000000
MaxTorqueTốc độ quay tối đa được áp dụng cho thiết bị để đạt được mục tiêu của nó.10000
ResponsivenessGiá trị càng cao hơn khiến mục tiêu đạt được mục tiêu của mình nhanh hơn.10

Nhập mô-đun

Một số

nhân bản

Khi tính năng RunLocally (mặc định) bị sai (giả sử), khách hàng sẽ xử lý tất cả các dữ liệu để gửi cho máy chủ để thực hiện cuộc kéo. Ở chế độ này, tất cả các dấu hiệu tùy chỉnh và hàm được đă

Khi đặt tính RunLocally lên, không có sự kiểm tra đến máy chủ. Tất cả các dấu hiệu kiểm tra tùy chỉnh và hành động đăng nhập đều phải ở client LocalScripts và bạn phải sử dụng điều

Tạo phản hồi cho người nhấp chuột và kéo

Thông qua các tín hiệu sự kiện, thay đổi chất bố trí, Scriptable kiểu dịch chuyển và tùy chỉnh hành động, những người lập trình có thể đáp lại sự thao tác của những người dùng kéo để lái UI hoặc đưa ra

Tín hiệu sự kiện

Thông qua các dấu hiệu sự kiện sau đây, bạn có thể phát hiện khi một người bắt đầu, tiếp tục và kết thúc kéo một đối tượng.

Sự kiệnMô tả
DragStartLửa khi một người bắt đầu kéo vật thể.
DragContinueLửa khi một người tiếp tục kéo mục từ sau khi đã kích hoạt DragStart .
DragEndLửa khi một người dừng khiến vật đối tượng.
DragDetector - Tín hiệu sự kiện

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)

Kéo thay đổi khung

Ngoài ra, bạn có thể theo dõi sự thay đổi trong tín hiệu sự kiện của thiết bị ngay trên trình phát.

DragDetector - Thay đổi khung

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

Kiểu Trao Đổi Được Lập Trình

Nếu bạn đặt một DragStyle của detector lên Scriptable, bạn có thể cung cấp chức năng của riêng bạn mà nhận một Ray và trả lại một không gian thế giới 2>Datatype.CFrame

DragDetector - Scripted DragStyle

local dragDetector = script.Parent.DragDetector
dragDetector.DragStyle = Enum.DragDetectorDragStyle.Scriptable
local cachedHitPoint = Vector3.zero
local cachedHitNormal = Vector3.yAxis
local function followTheCursor(cursorRay)
-- Loại bỏ đối tượng kéo từ phát hiện raycast
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)

Hàm Giới Hạn Tùy Chỉnh

Các thiết bị dò dòng không có các quy tắc chuyển động bên trong về lưới và kẹp, nhưng bạn có thể đăng ký các hàm hẹn tùy chỉnh để chỉnh sửa DragFrame trước khi nó được áp dụng. V

DragDetector - Chức Năng Giới Hạn

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

Ví dụ sử dụng

Đối tượng Vật lý Không có Chân

Một trò chơi cơ bản của cảnh báo kéo là một trò chơi cân bằng tour nơi các người chơi phải cẩn thận loại bỏ các khối và cố gắng giữ cho tour thẳng. Trong cấu trúc tháp sau đây, mỗi khối có một đứa con

Mô Hình Cố Định Với Các Bộ Phận Điều Chỉnh

Bạn có thể dễ dàng tạo và chia sẻ các mô hình mà được kết dính chủ yếu, nhưng có một hoặc nhiều bộ phận con/mô hình mà người chơi có thể kéo. Ví dụ, bàn làm việc sau đây có hai ngăn tủ mà người chơi có thể mở để kiểm tra những gì ở bên trong.

Kéo các thiết bị dò dòng và hạn chế

Bạn có thể kết hợp các ngăn ngừa dịch chuyển với Constraints, ví dụ như một con rắn lưỡi. Trong cấu hình sau đây, các tay cầm điều khiển đượ

Giao Diện Người Dùng 3D

Giao diện người dùng 3D được dễ dàng thực hiện thông qua các thiết bị dò dịu như cả

DragDetector - Giao Diện Người Dùng 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
-- Điều chỉnh kích thước hạt và tốc độ dựa trên thông số X của thiết bị dò rơi
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)
-- Điều chỉnh màu hạt nhân chủ yếu dựa trên yếu tố Z của thiết bị dò dịch
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)