3D sürükleyici dedektörler

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

DragDetector örneği, kapıları ve çekmeceleri açmak, bir parçayı sürüklemek, bir bowling topunu yakalamak ve fırlatmak, bir lastik fırlatıcı ile geriye çekmek ve ateşlemek gibi, bir deneyimde 3D nesnelerle etkileşimi kolaylaştırır ve teşvik eder. Ana özellikler arasında şunlar bulunur:

Nesneleri sürüklenebilir hale getirme

Herhangi bir parçayı veya modeli sürüklenebilir hale getirmek için, doğrudan bir DragDetector eklemeniz yeterlidir.

  1. Explorer penceresinde, Part, MeshPart veya Model üzerinde fare ile duraklayın ve ⊕ butonuna tıklayın. Bir bağlam menüsü görüntülenir.

  2. Menüden bir DragDetector ekleyin.

  3. Varsayılan olarak, nesne artık zemin düzleminde sürüklenebilir hale gelecektir ancak DragStyle'ını özelleştirebilir, nasıl harekete yanıt verdiğini tanımlayabilir ve isteğe bağlı olarak ekseni veya hareket sınırlarını uygulayabilirsiniz.

Sürükleyici dedektörleri özelleştirme

Sürükleme stili

DragDetectors, imleç hareketini sanal çizgilere ve düzlemlere eşleyerek önerilen 3B hareketi hesaplar. DragStyle özelliği aracılığıyla, ihtiyaçlarınıza uygun farklı eşlemelerden seçim yapabilirsiniz. Örneğin, TranslatePlane sanal bir düzlemde çeviri üretirken, RotateAxis sanal bir eksen etrafında döndürme üretir.

AyarAçıklama
TranslateLineDedektörün Axis öğesi boyunca 1D hareket, varsayılan olarak dünya Y ekseni boyunca.
TranslatePlaneDedektörün Axis öğesine dik düzlemde 2D hareket, varsayılan olarak dünya XZ düzlemi.
TranslatePlaneOrLineDedektörün Axis öğesine dik düzlemde 2D hareket ve modifikatör aktifken, dedektörün Axis öğesi boyunca 1D hareket.
TranslateLineOrPlaneDedektörün Axis öğesi boyunca 1D hareket ve modifikatör aktifken, dedektörün Axis öğesine dik düzlemde 2D hareket.
TranslateViewPlaneKameranın görünümüne dik düzlemde 2D hareket. Bu modda, düzlem sürekli güncellenir ve sürüklerken kameranın mevcut görünümüne her zaman dönük olur.
RotateAxisDedektörün Axis öğesi etrafında döndürme, varsayılan olarak dünya Y ekseni.
RotateTrackballTrackball döndürmesi, TrackballRadialPullFactor ve TrackballRollFactor özellikleri ile daha fazla özelleştirilir.
BestForDeviceFare ve gamepad için TranslatePlaneOrLine; dokunma için TranslatePlane; VR için 6DOF.
Scriptableİstenilen hareketi, SetDragStyleFunction() aracılığıyla sağlanan özel bir fonksiyonla hesaplar.

Sürükleme yönü

Varsayılan olarak, 3D hareket ve ilişkili DragStyle dünya alanına eşlenir. Ancak, örneğin ayarlanabilir parçalara sahip modeller inşa ederken ReferenceInstance, Orientation veya Axis'ı değiştirmek isteyebilirsiniz.

ÖzellikAçıklamaVarsayılan
ReferenceInstancePivotu, sürükleyici dedektör için referans çerçevesi sağlayan bir örnek. DragFrame, bu referans çerçevesine göre ifade edilir ve GetReferenceFrame() ile alınabilir. Referans çerçevesi nil ise, çeviri dünya alanında Axis özelliğinin yönünde (veya ona dik düzlemde) yapılacaktır.nil
OrientationHareket eksenlerinin referans çerçevesine göre YXZ döndürmesini belirtir (referans çerçevesinin kendisinin yönünü değiştirmez). Doğrusal çeviri ve eksenel döndürme, bu yeniden yönlendirilmiş Y ekseninde olacaktır ve düzlemsel çeviri XZ düzleminde olacaktır. Bu değeri değiştirmek, otomatik olarak Axis'ı günceller ve tam tersini de yapar.(0, 0, 0)
AxisReferans çerçevesine göre ifade edilen ana hareket ekseni. Bu değeri değiştirmek, otomatik olarak Orientation'ı günceller ve tam tersini de yapar.(0, 1, 0)

Hareket yanıtı

ResponseStyle özelliği, bir nesnenin önerilen harekete nasıl yanıt verdiğini belirler; nesne Anchored mı yoksa değil mi.

AyarSabitlenmiş davranışSabitlenmemiş davranış
GeometricHem çalışmakta olan deneyimde hem de Studio düzenleme modunda, sabitlenmiş bir nesnenin konumu/yönelimi, önerilen harekete tam olarak yansıtılacak şekilde güncellenecektir.Bir sabitlenmemiş nesne için, davranış sabitlenmiş nesne ile aynı olacaktır. Ancak, çalışan bir deneyimde, nesne sürükleme başlangıcında sabitlenecek ve sürükleme serbest bırakıldığında sabitlenmemiş olarak geri dönecektir.
PhysicalSabitlenmiş bir nesne, kuvvetlerden etkilenmediği için varsayılan olarak Geometric davranışına sahip olacaktır.Sabitlenmemiş bir nesne, önerilen harekete verilen istenen konum ve/veya yönelimi sağlamak için kısıtlama kuvvetleri tarafından taşınacaktır.
CustomNesne hiç hareket etmeyecek, ancak DragFrame hala güncellenebilir ve istediğiniz gibi sürükleme manipülasyonuna yanıt verebilirsiniz.(sabitlenmiş ile aynı)

Eksen ve hareket sınırları

Varsayılan olarak, DragStyle'ın doğasında bulunan kısıtlamalar dışında 3D hareket için herhangi bir kısıtlama yoktur. Gerekirse, hem çeviri hem de döndürme için minimum ve maksimum sınırlar uygulayabilirsiniz. Ancak, bunların kısıtlama olmadığını, yalnızca sürükleyici dedektörün sınırlar içinde kalmak için hareket üretme çabalarını sınırladığını unutmayın.

ÖzelliklerAçıklamaVarsayılan

MinDragTranslation
MaxDragTranslation

Her bir boyutta sürükleme çeviri sınırları. Eğer MaxDragTranslation, MinDragTranslation'dan büyükse, çeviri bu aralık içinde tutulur.(0, 0, 0)

MinDragAngle
MaxDragAngle

Yalnızca DragStyle RotateAxis olarak ayarlandığında geçerlidir. Eğer MaxDragAngle, MinDragAngle'dan büyükse, döndürme bu aralık içinde tutulur.0

Sürükleme izinleri

Oyuncuların belirli bir sürükleyici dedektör örneği ile etkileşime girme izni, PermissionPolicy özelliği aracılığıyla belirtilebilir. Varsayılan olarak Enum.DragDetectorPermissionPolicy.Everybody olarak ayarlanmıştır ve kod örneğinde gösterildiği gibi script ile izin kontrolünü destekleyecek şekilde değiştirilebilir.

AyarAçıklama
NobodyHiçbir oyuncu DragDetector ile etkileşime giremez.
EverybodyTüm oyuncular DragDetector ile etkileşime girebilir.
ScriptableOyuncuların sürükleme izinleri, SetPermissionPolicyFunction() aracılığıyla kaydedilen bir fonksiyon tarafından belirlenecektir. Bu ayar altında, bir fonksiyonu kaydetmeme veya geçersiz bir sonuç döndürme durumu tüm oyuncuların sürüklemesini engelleyecektir.
DragDetector - Scriptlenebilir Sürükleme İzni

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)

Fizik yanıtı

Eğer bir sürükleyicinin yanıt stili Fiziksel olarak ayarlandıysa ve sabitlenmemiş bir nesneye uygulanıyorsa, bu nesne önerilen harekete verilen konum/yönelimi elde etmek için kısıtlama kuvvetleri tarafından taşınacaktır. Fiziksel yanıtı aşağıdaki özellikler aracılığıyla daha da özelleştirebilirsiniz:

ÖzellikAçıklamaVarsayılan
ApplyAtCenterOfMassSahte olduğunda, sürükleme kuvveti kullanıcının tıkladığı noktada uygulanır. Doğru olduğunda, kuvvet nesnenin kütle merkezinde uygulanır.false
MaxForceNesnenin hedefe ulaşması için uygulanan maksimum kuvvet.10000000
MaxTorqueNesnenin hedefe ulaşması için uygulanan maksimum tork.10000
ResponsivenessDaha yüksek değerler, nesnenin hedefe daha hızlı ulaşmasını sağlar.10

Modifikatör girişi

Bazı DragStyle modları, kullanıcıların sürüklenen nesneyi farklı şekillerde manipüle etmek için bir modifikatör tuşu/buttonunun basılı tutulmasına izin verir. Varsayılan olarak, modifikatör PC'de LeftControl, gamepad'de ButtonR1 ve VR'de ButtonL2'dir. Bu modifikatörleri, sürükleyici dedektör örneğinin KeyboardModeSwitchKeyCode, GamepadModeSwitchKeyCode veya VRSwitchKeyCode özellikleri aracılığıyla özelleştirebilirsiniz.

Replikasyon

RunLocally özelliği yanlış olduğunda (varsayılan), istemci tüm girişi yorumlayarak veriyi sunucuya gönderir, bu da sürüklemeyi gerçekleştirir. Bu modda, tüm özel olay sinyalleri ve kayıtlı fonksiyonlar sunucu Scripts içinde olmalıdır.

RunLocally özelliği doğru olduğunda, hiçbir olay sunucuya kopyalanmaz. Tüm özel olay sinyalleri ve kayıtlı fonksiyonlar istemci LocalScripts içinde olmalı ve gerekli değişiklikleri sunucuya iletmek için uzak olaylar kullanmalısınız.

Tıklama ve sürükleme için script yanıtları

Olay sinyalleri aracılığıyla, özellik değişiklikleri, Scriptable sürükleme tarzı ve özel fonksiyonlar, scriptler sürüklenen nesnelerin manipülasyonuna yanıt verebilir ve UI'yi yönlendirmek veya mantıksal kararlar almak için kullanılabilir; örneğin kaydırma duvar anahtarına göre bir odadaki ışık seviyesini ayarlamak gibi.

Olay sinyalleri

Aşağıdaki olay sinyalleri aracılığıyla, bir kullanıcının bir nesneyi sürüklemeye başladığında, devam ettiğinde ve durduğunda algılayabilirsiniz.

OlayAçıklama
DragStartBir kullanıcı nesneyi sürüklemeye başladığında tetiklenir.
DragContinueBir kullanıcı, DragStart başlatıldıktan sonra nesneyi sürüklemeye devam ettiğinde tetiklenir.
DragEndBir kullanıcı nesneyi sürüklemeyi bıraktığında tetiklenir.
DragDetector - Olay Sinyalleri

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)

Sürükleme çerçevesi değişiklikleri

Olay sinyalleri dışında, dedektörün DragFrameındaki değişiklikleri doğrudan izleyebilirsiniz.

DragDetector - DragFrame Değişiklikleri

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

Scriptlenebilir sürükleme stili

Bir dedektörün DragStyle'ını Scriptable olarak ayarladığınızda, bir Ray alıp dünya alanında bir CFrame döndüren kendi fonksiyonunuzu sağlayabilirsiniz. Dedektör, sürüklenen nesnenin bu özel konum/yönelime gitmesini sağlayacak şekilde hareketi yönlendirecektir.

DragDetector - Scriptlenebilir Sürükleme Stili

local Workspace = game:GetService("Workspace")
local dragDetector = script.Parent.DragDetector
dragDetector.DragStyle = Enum.DragDetectorDragStyle.Scriptable
local cachedHitPoint = Vector3.zero
local cachedHitNormal = Vector3.yAxis
local function followTheCursor(cursorRay)
-- Sürüklenen nesneyi raycast algılama dışında bırak
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)

Özel kısıtlama fonksiyonu

Sürükleyici dedektörler, ızgara ve yakalama ile ilgili yerleşik hareket kurallarına sahip değildir ancak dedektörün DragFrameını uygulanmadan önce düzenlemek için özel kısıtlama fonksiyonları kaydedebilirsiniz. Örneğin, pozisyonları ızgara artışlarının katlarına yuvarlayarak hareketi bir ızgarada tutabilir veya her parçanın hareket kurallarına uygun bir satranç oyunu simüle edebilirsiniz.

DragDetector - Özel Kısıtlama Fonksiyonu

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 = SNAP_INCREMENT // 1
if snapIncrement < 1 then
return proposedMotion
end
local newWorldPosition = startPartPosition + proposedMotion.Position
local roundedX = ((newWorldPosition.X / snapIncrement + 0.5) // 1) * snapIncrement
local roundedY = ((newWorldPosition.Y / snapIncrement + 0.5) // 1) * snapIncrement
local roundedZ = ((newWorldPosition.Z / snapIncrement + 0.5) // 1) * snapIncrement
local newRoundedWorldPosition = Vector3.new(roundedX, roundedY, roundedZ)
return proposedMotion.Rotation + (newRoundedWorldPosition - startPartPosition)
end
local connection = dragDetector:AddConstraintFunction(2, snapToWorldGrid)
-- Uygun olduğunda, kısıtlama fonksiyonunu kaldırmak için connection:Disconnect() çağrısını yapın

Örnek kullanım

Sabitlenmemiş fiziksel nesneler

Sürükleyici dedektörlerin temel bir uygulanışı, oyuncuların dikkatlice parçaları çıkarmaya çalışacağı ve kuleyi dik tutma çabası içinde olacağı bir kule dengeleme oyunudur. Aşağıdaki kule yapısında, her parçada varsayılan DragStyle olan TranslatePlane ile sürüklenebilir bir DragDetector çocuk olarak yer alır; böylece oyuncular parçaları dışarı çekebilir ancak yukarı veya aşağı süremezler.

Sabitlenmiş modeller ile ayarlanabilir parçalar

Özellikle sabitlenmiş olan modelleri daha fazla çocuk parça/model ile oluşturabilir ve paylaşabilirsiniz; oyuncular bu parçaları sürükleyebilir. Örneğin, aşağıdaki masa iki çekmeceden oluşur; oyuncular bunları açarak içini inceleyebilir.

Sürükleyici dedektörler ve kısıtlamalar

Sürükleyici dedektörleri Constraints ile birleştirebilirsiniz; örneğin, bir kukla marionet. Aşağıdaki kurulumda, kontrol sapları sabitlenmiş, vücut parçaları sabitlenmemiştir ve kısıtlamalar marioneti bir arada tutar. Sapları TranslateViewPlane DragStyle ile kaydırmak marionetin dans etmesini ve bireysel vücut parçalarının da sürükleyici dedektörler ile hareket etmesini sağlar; tüm bunlar modelin bütünlüğünü korurken olur.

3D kullanıcı arayüzleri

3D kullanıcı arayüzleri, bir SpotLight'ın parlaklığını kaydırma anahtarına göre ayarlamak gibi, sürükleyici dedektörler aracılığıyla kolayca elde edilebilir. Ayrıca, iki farklı 3D kullanıcı arayüzü alanını kontrol etmek için X ve Z eksenlerini ayrı ayrı algılayabilirsiniz; örneğin, bir ParticleEmitter'ın Size, Speed ve Color değerlerini kontrol etmek gibi.

DragDetector - 3D Kullanıcı Arayüzü

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
-- Sürükleyici dedektörün X faktörüne göre parçacık boyutunu ve hızını ayarlayın
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)
-- Sürükleyici dedektörün Z faktörüne göre parçacık rengini ayarlayın
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)
©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.