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.
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ị.
Từ menu, insert a DragDetector .
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 đặt | Mô tả |
---|---|
TranslateLine | 1D chuyển động theo trục Axis của thiết bị, bởi mặc định thế giới Y trục. |
TranslatePlane | 2D motion in the plane perpendicular to the detector's Axis , by default the world XZ plane. |
TranslatePlaneOrLine | 2D motion in the plane perpendicular to the detector's Axis and, when the modifier is active, 1D motion along the detector's Axis . |
TranslateLineOrPlane | 1D 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 . |
TranslateViewPlane | 2D 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. |
RotateAxis | Xoay xung quanh trục Axis của máy dò địa vị, mặc định thế giới Y trục. |
RotateTrackball | Trackball 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. |
Scriptable | Tí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ính | Mô tả | Mặc định |
---|---|---|
ReferenceInstance | Mộ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ể được | nil |
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) |
Axis | Trụ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 đặt | Hành vi kết dính | Hà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ả. |
Physical | Mộ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ất | Mô tả | Mặc định |
---|---|---|
Class.DragDetector.MinDragTranslation|MinDragTranslation``Class.DragDetector.MaxDragTranslation|MaxDragTranslation | Giớ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|MaxDragAngle | Chỉ 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 đặt | Mô tả |
---|---|
Nobody | Không ai có thể tương tác với DragDetector . |
Everybody | Tất cả người chơi có thể tương tác với DragDetector . |
Scriptable | Cá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ính | Mô tả | Mặc định |
---|---|---|
ApplyAtCenterOfMass | Khi 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 |
MaxForce | Quản lý tối đa sức mạnh để đạt được mục tiêu của mục tiêu. | 10000000 |
MaxTorque | Tốc độ quay tối đa được áp dụng cho thiết bị để đạt được mục tiêu của nó. | 10000 |
Responsiveness | Giá 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ện | Mô tả |
---|---|
DragStart | Lửa khi một người bắt đầu kéo vật thể. |
DragContinue | Lửa khi một người tiếp tục kéo mục từ sau khi đã kích hoạt DragStart . |
DragEnd | Lử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)