The DragDetector örneği, kapıları ve düzgünleri açmak, bir parçayı kaydırmak, bir bowling topunu yakalayıp fırlatmak, geri çekilip bir sapan ateşlemek ve çok daha fazlası gibi deneyimde 3B nesnelerle etkileşimi kolaylaştırır ve teşvik eder.Önemli özellikler şunları içerir:
Herhangi bir DragDetector veya BasePart veya Model altına bir sürükleyebilir hale getirmek için tüm girişlerden (fare, dokunma, oyun konsolu ve VR) tek bir kod satırı olmadan bir koyun.
Birkaç sürükleme stilinden seçim yapın, nesnenin harekete nasıl yanıt vereceğini tanımlayın ve isteğe bağlı olarak eksen veya hareket sınırları uygulayın.
Scriptler, kaydırılan nesnelerin manipülasyonuna yanıt vererek arayüzü sürdürebilir veya bir odaya göre kaydırma duvar anahtarı dimerine dayalı olarak ışık seviyesini ayarlayarak mantıksal kararlar verebilir.
Oyuncular sabitlenmiş parçaları veya modelleri manipüle edebilir ve serbest bırakırken koyduğunuz yerde kalacaklar.
DragDetectors çalışma, kullanmıyorsanız Seç , Hareket , Ölçek veya Döndür araçlarını kullanarak, düzenlerken sürüklenebilir nesneleri test etmenizi ve ayarlamanızı kolaylaştırarak daha kolay test edilmesini sağlar.
Nesneleri sürükleyebilir hale getirin
Herhangi bir parçayı veya modeli sürüklenebilir hale getirmek için, doğrudan bir alt soyundan bir DragDetector ekleyin.
Araştırıcı penceresinde, , veya üzerine gelin ve ⊕ düğmesine tıklayın. Bir bağımsız menü görüntülenir.
Menüden, bir Sürükleyici Dedektörü ekleyin.
Varsayılan olarak, nesne artık yer tabanında sürüklenebilir olacak, ancak onun , harekete nasıl yanıt vereceğini tanımlayabilir ve isteğe bağlı olarak eksen veya hareket sınırları uygulayabilirsiniz .
Sürükleyici dedektörleri özelleştirin
Tarzı sürükle
DragDetectors önerilen 3B hareketini hesaplamak için sanal çizgilere ve uçaklara dokunma hareketini haritaya aktarın.DragStyle özelliği aracılığıyla, ihtiyaçlarınıza uyacak çeşitli haritalardan seçim yapabilirsiniz.Örneğin, TranslatePlane sanal bir uçakta çeviri üretirken, RotateAxis sanal bir eksen hakkında dönüş üretir.
Ayarlama | Açıklama |
---|---|
TranslateLine | Dedektörün Axis boyunca 1D hareketi, varsayılan olarak dünya Y eksen. |
TranslatePlane | Dedektörün Axis 'ine perpendikal olan uçakta 2B hareketi, varsayılan olarak dünya XZ uçağı. |
TranslatePlaneOrLine | Dedektörün Axis 'sine perpendikal olan 2B hareketi ve modifiye edici aktif olduğunda, dedektörün Axis boyunca 1D hareketi. |
TranslateLineOrPlane | Dedektörün Axis boyunca 1D hareketi ve modifiye edici aktif olduğunda, dedektörün Axis eşit yönde 2D hareketi. |
TranslateViewPlane | Kameranın görüşüyle perpendiküler 2D hareketi uçağında.Bu modda, uçak sürekli güncellenir, hatta sürükleme sırasında bile ve daima kameranın mevcut görüşüyle karşılaşacaktır. |
RotateAxis | Dedektörün Axis hakkındaki dönüş, varsayılan olarak dünya Y eksenidir. |
RotateTrackball | Trackball dönüşü, TrackballRadialPullFactor ve TrackballRollFactor özellikleri aracılığıyla daha da özelleştirildi. |
BestForDevice | Fare ve oyun kolu için TranslatePlaneOrLine ; Dokunma için TranslatePlane ; 6DOF VR için. |
Scriptable | İstediği hareketi SetDragStyleFunction() aracılığıyla sağlanan özel bir işlevle hesaplar. |
Yönü sürükleme
Varsayılan olarak, 3B hareket ve buna bağlı DragStyle dünya uzayına harita.Ancak, örneğin sürükleyici dedektörleri ReferenceInstance, Orientation veya Axis , örneğin ayarlanabilir parçalara sahip modellere yerleştirirken değiştirmek isteyebilirsiniz, örneğin sürükleyici dedektörleri modellere yerleştirirken.
Özellik | Açıklama | Varsayılan |
---|---|---|
ReferenceInstance | Ekseninin pivotu, sürükleyici dedektör için referans çerçevesi sağlayan bir örnek.The DragFrame , bu referans çerçevesine göre ifade edilir ve bu çerçeve ile GetReferenceFrame() aracılığıyla alınabilir.Referans çerçevesi nil ise, çeviri dünya uzayındaki Axis özelliğine doğru olacaktır. | nil |
Orientation | Referans çerçevesiyle ilgili hareket eksenlerinin YXZ dönüşünü belirtir (referans çerçevenin kendi yönünü değiştirmez).Lineer çevirme ve eksenel dönüş bu yeniden yönlendirilmiş Y ekseninde olacak ve XZ ekseninde plano tercümesi.Bu değeri otomatik olarak değiştirmek Axis ve tersine günceller. | (0, 0, 0) |
Axis | Referans çerçevesiyle ilişkilendirilmiş hareket ekseninin birincil eksen, bu değeri değiştirmek otomatik olarak Orientation ve tersine günceller. | (0, 1, 0) |
Harekete yanıt
The ResponseStyle özellik, bir nesnenin önerilen harekete nasıl yanıt vereceğini belirtir, nesnenin Anchored olup olmadığına bağlı olarak.
Ayarlama | Sabit davranış | Sabitlenmemiş davranış |
---|---|---|
Geometric | Koşan deneyimin içinde ve Studio düzenleme modunda, sabitlenmiş bir nesnenin konumu/yönü, önerilen hareketi yansıtmak için güncellenecektir. | Sabitlenmemiş bir nesne için, davranış sabitlenmiş bir nesne ile aynıdır.Ancak, devam eden bir deneyimde, nesne sürükleme başlangıcında sabitlenecek ve sürükleme bırakıldıktan sonra sabitlenmeyecek şekilde geri yüklenecektir. |
Physical | Kilitli bir nesne, kuvvetlerden etkilenmediği için varsayılan olarak Geometrik davranışına geçecektir. | Kilitli olmayan bir nesne, önerilen hareket tarafından verilen talep edilen konuma ve/veya yöne getirmeye çalışan kısıtlayıcı kuvvetler tarafından taşınacaktır. |
Custom | Nesne hiç hareket etmeyecek, ancak hala güncellenecek ve istediğiniz şekilde sürükleme manipülasyonuna yanıt verebileceksiniz. | (ancaklandığı gibi) |
Eksen ve hareket sınırları
Varsayılan olarak, 3B hareketin DragStyle 'in varsayılan sınırlarının ötesinde sınır yoktur.Gerekirse, çeviri ve dönüşüm için minimum ve maksimum sınırlar uygulayabilirsiniz.Bununla birlikte, bunlar sınırlar içinde kalmak için hareket üretmeye çalışan drag dedektörünün girişimlerini engellemez ; sadece sınırlar içinde kalmak için hareket üretmeye çalışıyorlar.
Özellikler | Açıklama | Varsayılan |
---|---|---|
Class.DragDetector.MinDragTranslation|MinDragTranslation``Class.DragDetector.MaxDragTranslation|MaxDragTranslation | Her boyutta çekme çevirisinin sınırları. MaxDragTranslation MinDragTranslation'dan daha büyükse, çeviri o aralık içinde kısılacaktır. | (0, 0, 0) |
Class.DragDetector.MinDragAngle|MinDragAngle``Class.DragDetector.MaxDragAngle|MaxDragAngle | Sadece önemli eğer DragStyle Döndürme Eksenine ayarlandıysa.Eğer MaxDragAngle daha büyükse MinDragAngle , dönüş bu aralık içinde kısıtlanacaktır. | 0 |
Yetkileri sürükle
Verilen bir sürükleyici dedektör instansıyla etkileşime girebilen oyuncuların izni, PermissionPolicy özelliğiyle belirlenebilir.Varsayılan olarak buna Enum.DragDetectorPermissionPolicy.Everybody ayarlandı ve kod örneğinde gösterildiği gibi senaryo tabanlı izin kontrollerini desteklemek için değiştirilebilir.
Ayarlama | Açıklama |
---|---|
Nobody | Hiçbir oyuncu ile DragDetector 'ye etkileşemez. |
Everybody | Tüm oyuncular DragDetector ile etkileşebilir. |
Scriptable | Oyuncuların sürükleme izinleri, SetPermissionPolicyFunction() aracılığıyla kayıtlı bir işlev tarafından belirlenecektir.Bu ayar altında, bir işlevi kaydetmemek veya geçersiz bir sonuç dönüşü yapmak, tüm oyuncuların sürüklenmesini engelleyecektir. |
DragDetector - Kodlanmış Sürükleme İznı
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ı
Bir sürücünün yanıt tarzının Fiziksel olarak ayarlandığı varsayılır ve bu sürücünün sabitlenmemiş bir nesneye uygulanması, önerilen hareketin verdiği pozisyona/yönlüğe taşınacak olan sınır kuvvetleri tarafından taşınacaktır.Fiziksel yanıtı aşağıdaki özellikler aracılığıyla daha da özelleştirebilirsiniz:
Özellik | Açıklama | Varsayılan |
---|---|---|
ApplyAtCenterOfMass | Yanlış olduğunda, kullanıcının tıkladığı noktada kuvvet uygulanır. Doğru olduğunda, kuvvet objenin kütle merkezine uygulanır. | sahte |
MaxForce | Nesneye ulaşması için uygulanan maksimum güç. | 10000000 |
MaxTorque | Hedefine ulaşmak için nesne için uygulanan maksimum tork. | 10000 |
Responsiveness | Daha yüksek değerler, nesnenin hedefine daha hızlı ulaşmasını sağlar. | 10 |
Modifiye edici giriş
Bazı modları, kullanıcıların farklı şekillerde sürüklenen nesneyi manipüle etmek için bir modifiye etme tuşu/düğmesini basılı tutmasına izin verir.Varsayılan olarak, değiştirici PC'de LeftControl , oyun konsolunda ButtonR1 veya VR'de ButtonL2 dir.Bu değiştiricileri KeyboardModeSwitchKeyCode , GamepadModeSwitchKeyCode veya VRSwitchKeyCode sürükleyici dedektör instansının özellikleri aracılığıyla özelleştirebilirsiniz.
Replikasyon
RunLocally özelliği yanlış olduğunda (Varsayılan), istemci sürüklemeyi gerçekleştirmek için sunucuya gönderdiği verileri üretmek için tüm girişleri yorumlar.Bu modda, tüm özel etkinlik sinyalleri ve kayıtlı işlevler sunucuda olmalıdır Scripts .
RunLocally özelliği doğru olduğunda, sunucuya hiçbir etkinlik yansıtılmaz.Tüm özel etkinlik sinyalleri ve kayıtlı işlevler istemci LocalScripts içinde olmalıdır ve sunucuya gerekli değişiklikleri yaymak için uzaktan etkinlikler kullanmalısınız.
Tıklama ve sürüklemeye yanıt veren kodlar
Etkinlik sinyalleri aracılığıyla , özellik değişiklikleri, sürükleme stili ve özel fonksiyonlar, kullanıcı arayüzünü sürmek veya mantıksal kararlar vermek için sürüklenen nesnelerin manipülasyonuna yanıt verebilirler, bir odaya göre kaydırma duvar anahtarı dimerine dayalı ışık seviyesini ayarlayarak.
Etkinlik sinyalleri
Aşağıdaki etkinlik sinyalleri aracılığıyla, bir kullanıcının bir nesneyi sürüklemeye başladığını, devam ettiğini ve bitirdiğini tespit edebilirsiniz.
Olay | Açıklama |
---|---|
DragStart | Bir kullanıcı nesneyi sürüklemeye başladığında ateş eder. |
DragContinue | Bir kullanıcı, DragStart başlatıldıktan sonra nesneyi sürüklemeyi sürdürdüğünde ateş eder. |
DragEnd | Bir kullanıcı nesneyi sürüklemeyi bıraktığında ateş eder. |
Sürükleyici Dedektör - Etkinlik 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)
Çerçeve değişikliklerini sürükle
etkinlik sinyallerine ek olarak, dedektörün DragFrame değişikliklerini doğrudan izleyebilirsiniz.
Sürükleyici Dedektör - Sürükleyici Çerçeve Değişiklikleri
local dragDetector = script.Parent.DragDetector
dragDetector:GetPropertyChangedSignal("DragFrame"):Connect(function()
local currentDragTranslation = dragDetector.DragFrame.Position
print(currentDragTranslation)
end)
Kodlanmış sürükleme stili
Bir dedektörün DragStyle 'sini Yazılabilir 'e ayarlarsanız, bir Ray 'i alan ve bir dünya uzayını CFrame geri veren kendi işlevinizi sağlayabilirsiniz.Dedektör, hareketi yönlendirerek kaydırılan nesneyi bu özel konuma/yönlendirmeye gönderir.
DragDetector - Kodlanmış DragStyle
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ılamasından dışla
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 sınır işlevi
Sürükleyici dedektörlerin ızgaralar ve yapıştırmalarla ilgili yerleşik hareket kuralları yoktur, ancak dedektörün DragFrame önce uygulanmasından önce özel kısıtlayıcı işlevleri kaydedebilirsiniz.Örneğin, pozisyonları grid artışının çarpanlarına yuvarlayarak bir tabloda hareketi tutabilir veya her bir parçaya uygun hareket kurallarıyla bir satranç oyununu simüle edebilirsiniz.
Sürükleyici Dedektör - Özel Kısıtma İş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)
-- When applicable, remove the constraint function by invoking connection:Disconnect()
Örnek kullanım
Sabitlenmemiş fiziksel nesneler
Sürü algılayıcıların temel bir uygulaması, oyuncuların dikkatlice parçaları kaldırması ve kuleyi dik tutmaya çalışması gereken bir kule denge oyunudur.Aşağıdaki kule yapısında, her parça varsayılan bir çocuğa sahiptir TranslatePlane ile dışarı çekilebilir, ancak oyuncular parçaları yukarı, aşağı veya aşağı çekemez.
Ayarlanabilir parçalarla sabitlenmiş modeller
Ana olarak sabitlenmiş ancak oyuncuların sürükleyebileceği bir veya daha fazla çocuk parçası/modeli olan kolayca model oluşturabilir ve paylaşabilirsiniz.Örneğin, aşağıdaki masada oyuncuların içeride ne olduğunu kontrol etmek için açabilecekleri iki çekmece var.
Tespit edicileri ve sınırları sürükle
Sürükleyici dedektörleri Constraints ile birleştirebilirsiniz, örneğin bir marionet kukla.Aşağıdaki kurulumda, kontrol kolları sabitlenir, vücut parçaları sabitlenmez ve kısıtlamalar marioneti bir arada tutar.Kolları TranslateViewPlane ile hareket ettirmek, marionet dansını yapar ve bireysel vücut parçaları da sürükleyici dedektörlerle hareket edebilir, tüm bu sırada model bütünlüğünü korur.
3D kullanıcı arayüzleri
3B kullanıcı arayüzleri, kaydırma dedektörleri aracılığıyla kolayca elde edilebilir, örneğin bir SpotLight kaydırma anahtarı parlaklığını ayarlayarak.Ayrıca, X ve Z eksenlerini bireysel olarak tespit ederek, 3B kullanıcı arayüzünün iki farklı yönünü kontrol edebilirsiniz, örneğin , ve .
Sürükleyici Dedektör - 3B 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
-- Parçacık boyutunu ve hızını, sürükleme dedektörü X faktörüne göre 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)
-- Parçacık rengini sürükleyici algılayıcı Z faktörüne göre ayarla
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)