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, bir oyundaki 3D nesnelerle etkileşimi kolaylaştırır ve teşvik eder; örneğin kapıları ve çekmeceleri açmak, bir parçayı kaydırmak, bir bowling topunu yakalamak ve fırlatmak, bir sapanı geri çekmek ve ateşlemek ve daha fazlası. Ana özellikler şunlardır:

  • Herhangi bir BasePart veya Model altına bir DragDetector yerleştirerek, sürüklenebilir hale getirebilirsiniz; bu, tüm girişlerle (fare, dokunma, oyun kumandası ve VR) yapılır ve tek bir kod satırı gerektirmez.

  • Birkaç sürükleme stili arasından seçim yapın, nesnenin harekete nasıl tepki verdiğini tanımlayın ve isteğe bağlı olarak ekseni veya hareket sınırlarını uygulayın.

  • Betikler, sürüklenen nesnelerin manipülasyonuna yanıt verebilir, böylece UI'yi yönlendirebilir veya bir odadaki ışık seviyesini bir kaydırmalı duvar anahtarı dimmerine göre ayarlamak gibi mantıksal kararlar alabilir.

  • Oyuncular, sabit parçaları veya modelleri manipüle edebilir ve bunlar bırakıldığında tam olarak yerinde kalır.

  • DragDetectors, Seç, Taşı, Ölçek veya Döndür araçlarını kullanmadığınız sürece Studio'da çalışır; bu, düzenleme sırasında sürüklenebilir nesneleri test etmeyi ve ayarlamayı kolaylaştırır.

Nesneleri sürüklenebilir hale getirme

Herhangi bir parça veya modeli sürüklenebilir hale getirmek için, doğrudan bir alt öğe olarak bir DragDetector ekleyin.

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

  2. Menüyü açın ve bir DragDetector ekleyin.

  3. Varsayılan olarak, nesne artık yer düzleminde sürüklenebilir olacak, ancak DragStyle'ını özelleştirebilir, nesnenin harekete nasıl tepki 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 3D hareketi hesaplar. DragStyle özelliği aracılığıyla, ihtiyaçlarınıza uygun farklı eşlemeler arasından 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'i boyunca 1D hareket, varsayılan olarak dünya Y ekseni.
TranslatePlaneDedektörün Axis'ine dik düzlemde 2D hareket, varsayılan olarak dünya XZ düzlemi.
TranslatePlaneOrLineDedektörün Axis'ine dik düzlemde 2D hareket ve modifikatör aktif olduğunda, dedektörün Axis'i boyunca 1D hareket.
TranslateLineOrPlaneDedektörün Axis'i boyunca 1D hareket ve modifikatör aktif olduğunda, dedektörün Axis'ine 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, sürükleme sırasında bile, ve her zaman kameranın mevcut görünümüne bakar.
RotateAxisDedektörün Axis'i etrafında döndürme, varsayılan olarak dünya Y ekseni.
RotateTrackballTrackball döndürmesi, TrackballRadialPullFactor ve TrackballRollFactor özellikleri aracılığıyla daha fazla özelleştirilir.
BestForDeviceFare ve oyun kumandası için TranslatePlaneOrLine; dokunma için TranslatePlane; VR için 6DOF.
Scriptableİstenilen hareketi SetDragStyleFunction() aracılığıyla sağlanan özel bir işlevle hesaplar.

Sürükleme yönü

Varsayılan olarak, 3D hareket ve ilişkili DragStyle dünya alanına eşlenir. Ancak, ReferenceInstance, Orientation veya Axis'i değiştirmek isteyebilirsiniz; örneğin, ayarlanabilir parçalara sahip modellerin içine sürükleyici dedektörler yerleştirirken.

ÖzellikAçıklamaVarsayılan
ReferenceInstanceSürükleyici dedektör için referans çerçevesi sağlayan bir örnek. DragFrame, bu referans çerçevesine göre ifade edilir ve GetReferenceFrame() aracılığıyla alınabilir. Referans çerçevesi nil ise, çeviri Axis özelliği yönünde (veya ona dik düzlemde) dünya alanında olacaktı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, düzlemsel çeviri ise XZ düzleminde olacaktır. Bu değeri değiştirmek, otomatik olarak Axis'i günceller ve tersine.(0, 0, 0)
AxisHareketin ana ekseni, referans çerçevesine göre ifade edilir. Bu değeri değiştirmek, otomatik olarak Orientation'ı günceller ve tersine.(0, 1, 0)

Hareket tepkisi

ResponseStyle özelliği, bir nesnenin önerilen harekete nasıl tepki vereceğini belirtir; bu, nesnenin Anchored olup olmamasına bağlıdır.

AyarSabit davranışSabit olmayan davranış
GeometricHem çalıştırılan oyunda hem de Studio düzenleme modunda, sabit bir nesnenin konumu/yönü, önerilen hareketi tam olarak yansıtacak şekilde güncellenecektir.Sabit olmayan bir nesne için, davranış sabit bir nesne ile aynı olacaktır. Ancak, çalıştırılan oyunda, nesne sürüklemenin başlangıcında sabitlenecek ve sürükleme bırakıldığında sabit olmayan hale getirilecektir.
PhysicalSabit bir nesne varsayılan olarak Geometrik davranış sergileyecektir, çünkü kuvvetlerden etkilenmez.Sabit olmayan bir nesne, önerilen harekete göre istenen konuma ve/veya yöne getirmeye çalışan kısıtlama kuvvetleri tarafından hareket ettirilecektir.
CustomNesne hiç hareket etmeyecek, ancak DragFrame yine de güncellenecek ve sürükleme manipülasyonuna istediğiniz gibi yanıt verebilirsiniz.(sabit olanla aynı)

Eksen ve hareket sınırları

Varsayılan olarak, DragStyle'ın doğasında var olan kısıtlamalar dışında 3D harekete hiçbir sınır 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ınırlar içinde kalmak için hareket dedektörünün hareket üretme çabalarını engellediğini unutmayın.

ÖzelliklerAçıklamaVarsayılan
MinDragTranslation
MaxDragTranslation
Her bir boyutta sürükleme çevirisini sınırlar. MaxDragTranslation, MinDragTranslation'dan büyükse, çeviri bu aralık içinde sınırlanacaktır.(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 sınırlanacaktır.0

Sürükleme izinleri

Bir oyuncunun belirli bir sürükleyici dedektör örneği ile etkileşim kurma izni, PermissionPolicy özelliği ile belirtilebilir. Bu varsayılan olarak Enum.DragDetectorPermissionPolicy.Everybody olarak ayarlanmıştır ve kod örneğinde gösterildiği gibi, betik izin kontrollerini desteklemek için değiştirilebilir.

AyarAçıklama
NobodyHiçbir oyuncu DragDetector ile etkileşim kuramaz.
EverybodyTüm oyuncular DragDetector ile etkileşim kurabilir.
ScriptableOyuncuların sürükleme izinleri, SetPermissionPolicyFunction() aracılığıyla kaydedilen bir işlevle belirlenecektir. Bu ayar altında, bir işlev kaydetmeme veya geçersiz bir sonuç döndürme durumu, tüm oyuncuların sürüklemesini engelleyecektir.
DragDetector - Betik 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 tepkisi

Bir sürükleyicinin tepki stilinin Fiziksel olarak ayarlandığını ve sabit olmayan bir nesneye uygulandığını varsayarsak, o nesne, önerilen harekete göre verilen konuma/yöne getirmeye çalışan kısıtlama kuvvetleri tarafından hareket ettirilecektir. Fiziksel tepkiyi aşağıdaki özellikler aracılığıyla daha da özelleştirebilirsiniz:

ÖzellikAçıklamaVarsayılan
ApplyAtCenterOfMassYanlış 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.yanlış
MaxForceNesnenin hedefine ulaşması için uygulanan maksimum kuvvet.10000000
MaxTorqueNesnenin hedefine ulaşması için uygulanan maksimum tork.10000
ResponsivenessDaha yüksek değerler, nesnenin hedefine 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şuna/butonuna basılı tutmalarına izin verir. Varsayılan olarak, modifikatör PC'de LeftControl, oyun kumandasında ButtonR1 veya VR'da ButtonL2'dir. Bu modifikatörleri, sürükleyici dedektör örneğinin KeyboardModeSwitchKeyCode, GamepadModeSwitchKeyCode veya VRSwitchKeyCode özellikleri aracılığıyla özelleştirebilirsiniz.

Çoğaltma

RunLocally özelliği yanlış (varsayılan) olduğunda, istemci tüm girişi yorumlayarak sunucuya sürüklemeyi gerçekleştirmek için veri gönderir. Bu modda, tüm özel olay sinyalleri ve kaydedilmiş işlevler sunucu Scripts içinde olmalıdır.

RunLocally özelliği doğru olduğunda, hiçbir olay sunucuya çoğaltılmaz. Tüm özel olay sinyalleri ve kaydedilmiş işlevler istemci LocalScripts içinde olmalıdır ve gerekli değişiklikleri sunucuya iletmek için uzaktan olaylar kullanmalısınız.

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

Olay sinyalleri, özellik değişiklikleri, Scriptable sürükleme stili ve özel işlevler aracılığıyla, betikler sürüklenen nesnelerin manipülasyonuna yanıt verebilir; böylece UI'yi yönlendirebilir veya bir odadaki ışık seviyesini bir kaydırmalı duvar anahtarı dimmerine göre ayarlamak gibi mantıksal kararlar alabilir.

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 durdurduğunda tespit edebilirsiniz.

OlayAçıklama
DragStartBir kullanıcının 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 durdurduğunda 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'inde doğrudan değişiklikleri izleyebilirsiniz.

DragDetector - DragFrame Değişiklikleri
local dragDetector = script.Parent.DragDetector
dragDetector:GetPropertyChangedSignal("DragFrame"):Connect(function()
local currentDragTranslation = dragDetector.DragFrame.Position
print(currentDragTranslation)
end)

Betik sürükleme stili

Bir dedektörün DragStyle'ını Scriptable olarak ayarlarsanız, bir Ray alanı alan ve dünya alanında bir CFrame döndüren kendi işlevinizi sağlayabilirsiniz. Dedektör, sürüklenen nesnenin o özel konuma/yöne gitmesi için hareketi bu şekilde yönlendirecektir.

DragDetector - Betik 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 ışın izleme tespitinden hariç tut
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 işlevi

Sürükleyici dedektörler, ızgara ve yapışma hakkında yerleşik hareket kurallarına sahip değildir, ancak dedektörün DragFrame'ini uygulanmadan önce düzenlemek için özel kısıtlama işlevleri kaydedebilirsiniz. Örneğin, pozisyonları ızgara artışlarının katlarına yuvarlayarak hareketi bir ızgarada tutabilir veya her parçanın yasal hareket kurallarına göre bir satranç oyunu simüle edebilirsiniz.

DragDetector - Özel Kısıtlama İşlevi
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 işlevini kaldırmak için connection:Disconnect() çağrısını yapın

Örnek kullanım

Sabit olmayan fiziksel nesneler

Sürükleyici dedektörlerin temel bir uygulaması, oyuncuların dikkatlice parçaları çıkarması ve kulesi dik tutmaya çalışması gereken bir kule denge oyunudur. Aşağıdaki kule yapısında, her parça, oyuncuların parçaları dışarı çekmesine izin veren varsayılan DragStyle TranslatePlane olan bir alt DragDetector içerir, ancak yukarı veya aşağı çekmelerine izin verilmez.

Ayarlanabilir parçalara sahip sabit modeller

Temelde sabit olan, ancak oyuncuların sürükleyebileceği bir veya daha fazla alt parça/model içeren modeller oluşturmak ve paylaşmak oldukça kolaydır. Örneğin, aşağıdaki masa, oyuncuların içindekileri incelemek için açabileceği iki çekmeceye sahiptir.

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

Sürükleyici dedektörleri, örneğin bir kukla ile Constraints ile birleştirebilirsiniz. Aşağıdaki kurulumda, kontrol kolları sabit, gövde parçaları sabit olmayan ve kısıtlamalar kuklayı bir arada tutar. TranslateViewPlane DragStyle ile kolları hareket ettirmek kuklayı dans ettirir ve bireysel gövde parçaları da sürükleyici dedektörlerle hareket ettirilebilir; tüm bunlar modelin bütünlüğünü korurken gerçekleşir.

3D kullanıcı arayüzleri

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

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 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 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.