เครื่องตรวจจับ 3D Drag

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

Class.DragDetector ตัวอย่างที่เพิ่มความสะดวกและส่งเสริมให้กับการใช้งาน 3D ในประสบการณ์ เช่น เปิดประตูและลิ้นชัก เลื่อนส่วนรอบ หยิบและทิ้งลูกบอล ดึงและยิงลูกศร และอื่

  • วาง DragDetector ภายใต้ BasePart หรือ Model ใด ๆ รหัส(เมาส์, แท็งค์, เกมแพด, และ VR) โดยไม่มีเส้นโค้ด

  • เลือกจากหลายสไตล์ ลาก ระบุวิธีการที่วัตถุ ตอบสนองต่อการเคลื่อนไหว และใช้ตัวเลือกอาจใช้ ขีดจำกัดการเคลื่อนที่หรือขีดจำกัดการเคลื่อนที่

  • สคริปต์สามารถตอบสนองต่อการปรับแต่งวัตถุที่ลากได้เพื่อขับ UI หรือตัดสินใจโดยมีเหตุผล เช่นการปรับเลเวลแสงในห้องโดยใช้สวิตช์ด้ามจับบนผนังเลื่อน

  • ผู้เล่นสามารถจัดการชิ้นส่วนหรือโมเดลที่แนบมาและพวกเขาจะอยู่ที่ถูกต้องเหมือนที่คุณวางไว้เมื่อปล่อย

  • Class.DragDetector|DragDetectors ทำงานใน Studio นานเท่าที่คุณจะ ไม่ โดยใช้เครื่องมือ เลือก 、 0>ย้าย0> 、 3>ขนาด3> หรือ DragDetectors6> เครื่

ทำให้วัตถุเป็นสามารถลากได้

เพื่อทำให้อะไหล่หรือโมเดลมีความลาดได้ เพียงแค่เพิ่ม DragDetector เป็นบรรพบุรุษโดยตรง

  1. ใน หน้าต่าง Explorer เลื่อนเมาส์ไปที่ Part หรือ MeshPart หรือ 1> Class.Model1> และคลิกปุ่ม ⊕ เมนูบริบทรัพย์

  2. จากเมนู ใส่ ลบDetector

  3. ตามปกติวัตถุจะถูกลากในเครื่องบินในพื้นดิน แต่คุณสามารถปรับแต่ง DragStyle ของมัน วิธีการตอบสนองต่อการเคลื่อนไหว และใช้ ขีดจำกัดการเคลื่อนที่หรือขี

การปรับแต่งตัวตรวจจับการลาก

สไตล์การลาก

DragDetectors เคลื่อนไหวตัวเมาส์ให้เป็นเส้นและเครื่องบินเพื่อคํานวณการเคลื่อนไหว 3D ที่เสนอ ผ่านคุณสมบัติ <

การตั้งค่าคำอธิบาย
TranslateLine1D การเคลื่อนไหวตามแกนเหนือเครื่องตรวจจับ โดยปกติโลก Y แกน
TranslatePlane2D มุมเคลื่อนไหวในเครื่องบินสมมติเป็นสามเหลี่ยมแก่เครื่องตรวจจับ Axis โดยปกติเครื่องบิน XZ เครื่องบิน
TranslatePlaneOrLine2D มอเตอร์ในเครื่องบินเป็นสมมติที่ตรงกับเครื่องมือ Axis และเมื่อ ผู้ปรับแต่ง เปิดใช้งาน, 1D มอเตอร์ตามแนวเส้นของเครื่องมือ Class.DragDetector.Axis
TranslateLineOrPlane1D การเคลื่อนไหวตามแกนเห�ียวของเครื่องตรวจจับ และเมื่อ Axis ใช้งาน, 2D การเคลื่อนไหวในแนวตั้งของเครื่องตรวจจับ ใน Class.DragDetector.Axis|Axis .
TranslateViewPlane2D มอเตอร์ในเครื่องบินอยู่ในแนวตั้งของกล้อง ในโหมดนี้ เครื่องบินจะถูกปรับปรุงอยู่เสมอ แม้ว่าจะดึง และจะเผยให้เห็นด้านหน้าของกล้องเสมอ
RotateAxisการหมุนเกี่ยวกับเครื่องตรวจจับ Axis โดยปกติโลก Y แกน
RotateTrackballการหมุนลูกบอล, ปรับแต่งเพิ่มเติมผ่านคุณสมบัติ TrackballRadialPullFactor และ TrackballRollFactor โปรพี่.
BestForDeviceแปลเครื่องบินหรือเส้นสำหรับเมาส์และ gamepad ؛ แปลเครื่องบินสำหรับแตะ ؛ 6DOF สำหรับ VR
Scriptableคํานวณการเคลื่อนที่ที่ต้องการโดยการใช้ฟังก์ชันที่กําหนดเองที่มีให้ผ่าน SetDragStyleFunction()

ลากทิศทาง

โดยปกติ 3D มอเตอร์และแผนที่ DragStyle ในพื้นที่โลก คุณอาจต้องการเปลี่ยน ReferenceInstance

สมบัติคำอธิบายเริ่มต้น
ReferenceInstanceตัวอย่างที่มีล้อมุมเพื่อให้ โค้ดอ้างอิงฟรอมฟレーム สำหรับเครื่องตรวจจับดราก้อน สัญลักnil
Orientationระบุการหมุนของแกนของการเคลื่อนไหวที่เกี่ยวข้องกับเฟรมอ้างอิง (ไม่เปลี่ยนตำแหน่งของเฟรมอ้างอิงเอง) การแปลสายเกียร์และการหม(0, 0, 0)
Axisแกนหลักของการเคลื่อนที่ แสดงเป็นร้อยละของเฟรมอ้างอิง การเปลี่ยนค่านี้จะปรับปรุง Orientation และในทางกลับกัน(0, 1, 0)

ตอบสนองต่อการเคลื่อนไหว

สมบัติ ResponseStyle ระบุวิธีการที่วัตถุตอบสนองต่อการเคลื่อนไหวที่เสนอได้ ขึ้นอยู่กับว่าวัตถุเป็น Anchored หรือไม่

การตั้งค่าพฤติกรรมที่แนบมัดพฤติกรรมที่ไม่มีแนวโน้ม
Geometricทั้งในประสบการณ์ที่ดำเนินอยู่และในโหมดการแก้ไข Studio ตำแหน่ง/การจัดเรียงของวัตถุที่แนบอาจจะปรับให้เหมาะสมกับการเคลื่อนไหวที่เสนอไว้สำหรับวัตถุที่ไม่มีโครงสร้าง พฤติกรรมจะเหมือนกับวัตถุที่มีโครงสร้าง อย่างไรก็ตามในประสบการณ์ที่ดำเนินอยู่ วัตถุจะถูกแนบมาที่ต้นของการลากและจะถูกนำกลับไปยังวัตถุที่ไม่มีโครงสร้างหลังจ
Physicalวัตถุที่มีอยู่จะเริ่มต้นด้วยพฤติกรรม Geometric เนื่องจากไม่ได้รับผลกระทบจากการเปลี่ยนแปลงวัตถุที่ไม่มีติดอันจะถูกย้ายโดย รัศมีขีดจำกัด ที่พยายามจะนำมันไปยังตำแหน่งและ/หรือตำแหน่งที่ต้องการที่ได้รับโดยการเคลื่อนไหวที่เสนอ
Customวัตถุจะไม่เคลื่อนที่เลย แต่ DragFrame จะยังคงปรับปรุงและคุณสามารถ ตอบสนองการเคลื่อนไหวการลากเลื่อน ได้อย่างไรก็ตามที่คุณต้องการ(เหมือนกับที่แนบมัด)

ข้อจํากัดแกนและการเคลื่อนที่

โดยปกติไม่มีข้อจํากัดสําหรับการเคลื่อนไหว 3D นอกเหนือจากข้อจํากัดที่แนบมากับ DragStyle หากจําเป็นคุณสามารถใช้ขีดจํากั

สมบัติคำอธิบายเริ่มต้น
Class.DragDetector.MinDragTranslation|MinDragTranslation``Class.DragDetector.MaxDragTranslation|MaxDragTranslationข้อจํากัดในการลากแปลในแต่ละมิติ หาก MaxDragTranslation ใหญ่กว่า MinDragTranslation แปลจะถูกกระจําลังภายในขอบเขตนั้น(0, 0, 0)
Class.DragDetector.MinDragAngle|MinDragAngle``Class.DragDetector.MaxDragAngle|MaxDragAngleเฉพาะเมื่อ DragStyle ติดตั้งไว้ที่ หมุนแกนเหลี่ยม หาก MaxDragAngle ใหญ่กว่า 1> Class.DragDetector.MinDragAngle|MinDragAngle1> การหมุนจะถ0

ดึงความเข้าถึง

การอนุญาตของผู้เล่นที่จะใช้งานกับ instane เครื่องมือตรวจจับลายเซ็นของผู้เล่นสามารถกำหนดได้โดยสมบัติ PermissionPolicy โดยปกติจะตั้งค่าเป็น Enum.DragDetectorPermission Policy.

การตั้งค่าคำอธิบาย
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

การปรับแต่งข้อมูล

การเลียนแบบ

เมื่อค่าสมบัติ RunLocally เป็นปลอม (ปกติ) ไม่ใช่คลายเคลมของลูกค้า เมื่อเครื่องมือนี้ได้รับการใช้งานบนเซิร์ฟเวอร์ ก็จะส่งข้อมูลที่เก็บรวบรวม

เมื่อสมบัติของ RunLocally เป็นจริง ไม่มีเหตุการณ์ใด ๆ จะถูกเรียกไปยังเซิร์ฟเวอร์ สัญญาณกิจกรรมที่กำหนดเองและการลงทะเบียนทั้งหมดจ

การตอบสนองการคลิกและลาก

ผ่าน สัญญาณอีเว้นท์ การเปลี่ยนแปลงของโปรไฟล์, Scriptable สไตล์การลาก, และคุณสมบัติการกําหนดเวลาการแสดงผลของสคริปต์ตามจํานวนเวลาที่

สัญญาณอีเวนต์

ผ่านสัญญาณกิจกรรมต่อไปนี้คุณสามารถตรวจจับเมื่อผู้ใช้เริ่มต้นใช้ และติดตามการลากของวัตถุ

อีเวนต์คำอธิบาย
DragStartเกิดขึ้นเมื่อผู้ใช้เริ่มลากวัตถุ
DragContinueจะเกิดไฟไหม้เมื่อผู้ใช้ดึงตัววัตถุหลังจากที่ได้เริ่มการดึงเรียบร้อยแล้วหลังจากนี้จะเริ่มขึ้นมา DragStart ได้
DragEndเกิดขึ้นเมื่อผู้ใช้หยุดลากวัตถุ
DragDetector - สัญญาณอีเมนต์

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 ของเครื่องชี้วัดโดยตรง

DragDetector - เปลี่ยนแปลง DragFrame

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

สไตล์ลากของสคริป

หากคุณตั้งค่า เครื่องมือตรวจจับของเรา DragStyle เป็น สคริปท์ คุณสามารถให้ฟังก์ชันของคุณเองที่รับ Ray และ

DragDetector - สคริปดรากเทร็อกเตอร์

local dragDetector = script.Parent.DragDetector
dragDetector.DragStyle = Enum.DragDetectorDragStyle.Scriptable
local cachedHitPoint = Vector3.zero
local cachedHitNormal = Vector3.yAxis
local function followTheCursor(cursorRay)
-- ปิดการตรวจจับวัตถุที่ลากจาก 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)

หน้ากากกําหนดเอง

เครื่องตรวจจับไม่มีกฎเกณฑ์การเคลื่อนที่ของกริดและการสแนปในตัว แต่คุณสามารถลงทะเบียนคุณสมบัติได้เพื่อแก้ไขค่าของเครื่องตรวจจับก่อนที่

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

ตัวอย่างการใช้

วัตถุทางกายที่ไม่มีต้นฉบับ

เกมแห่งความสมดุลของเครื่องมือตรวจจับการลากเป็นเกมที่ผู้เล่นต้องลบชิ้นส่วนออกอย่างระมัดระวังและพยายามที่จะให้หอคอยตั้งตรง ในโคร

แบบอนุโมดีที่มีชิ้นส่วนปรับแต่ง

คุณสามารถสร้างและแบ่งปันโมเดลที่เป็นลูกดาวน์ได้อย่างง่ายดาย แต่มีส่วนหนึ่งหรือมากกว่าของชิ้นส่วน/โมเดลที่ผู้เล่นสามารถดึงได้ โดยเฉพาะอย่างยิ่ง โต๊ะต่อไปนี้มีสองลิ้นชักซึ่งผู้เล่นสา

ลากเครื่องตรวจจับและข้อจํากัด

คุณสามารถผสานเครื่องตรวจจับการลากกับ Constraints เช่นเครื่องปั้นตุ๊กตามาริโอเน็ต ในการตั้งค่าต่อไปน

3D อินเทอร์เฟซ

3D user interfaces สามารถเข้าถึงได้ง่ายผ่านเครื่องตรวจจับการลากเช่นการ

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)