Class.DragDetector instansı, bir deneyimde 3D nesnelerle etkileşimi kolaylaştırır ve teşvik eder, kapıları açar, dolapları çeker, bir parçayı yakalar ve atar, bir slingshot çeker ve çok daha fazlasını içerir. Key özellikleri şunları içerir:
Tüm DragDetector veya BasePart altında bir Model yerleştirin ve tüm girişler (faren, dokunma, oyun konsolu ve VR) aracılığıyla tüm yerleşik girişleri hareket ettirin. Errors: Error: Class.DragDetectorkod: major ---
Birden fazla sürükleme stilinden seçim yapın, nesnenin harekete nasıl yanıt verdiğini belirleyin ve opcional olarak eksen veya hareket sınırlarını uygulayın.
Kodlar, kaydırılmış nesnelerin manipülasyonuna cevap verebilir UI'yi sürüklemeye, ışık seviyesini bir kayar duvar anahtarına göre ayarlanması gibi mantıksal kararlar almak için kodu derlemek için kullanılabilir.
Oyuncular ankrajlı parçaları veya modelleri manipüle edebilir ve onlar yayınlandığında aynı yerde kalır.
Class.DragDetector|DragDetectors Studio'da çalışır, değil Seç'i kullanıyorsanız, Yerini Değiştir , 0> Boyutlandır0> veya DragDetectors3> aletlerini kullanarak, çalıştırmanızı kolaylaştırı
Nesneleri Sürükleme
Herhangi bir parçayı veya modeli yapılandırabilmek için sadece bir DragDetector ile aşağıdaki atlaştırıcıyı ekleyin.
Menüden bir DragDetector ekleyin.
Varsayılan olarak, artık nesne yer uçağında sürükleme için kullanılabilir, ancak onun DragStyle , harekete nasıl yanıt vereceğini özelleştirebilir ve opcional olarak eksen veya hareket sınırlarını uygulayabilir.
Gecikmeyi Tespit Etmeyi Özelleştirme
Çekme Tarzı
DragDetectors harita kurucu hareketini sanal çizgilere ve uçaklara çevirerek önerilen 3D hareketi hesaplamak için harita kurucu hareketini seçin. DragStyle özelliği aracılığıyla, farklı har
Ayarlar | Açıklama |
---|---|
TranslateLine | 1D hareketi, Axis , varsayılan olarak dünyanın Y ekseninde. |
TranslatePlane | 2D hareketi, Axis , varsayılan olarak dünyanın XZ uçağı. |
TranslatePlaneOrLine | 2D hareketi uçağın Axis ile perpendikülerine ve modifiyer aktif olduğunda, Axis ile 1D hareketi boyunca uçağın 1> Class.DragDetector.Axisi1> ile. |
TranslateLineOrPlane | 1D hareketi Axis ve, modifier aktif olduğunda, uçağın Axis ile perpendiküler olarak 2D hareketi . |
TranslateViewPlane | Uçakta kamera görüşüne paralel olarak 2D hareketi. Bu modda, uçak sürekli güncellenir, hatta çekilirken bile, ve her zaman kamera görüşüne bakacaktır. |
RotateAxis | Rotasyon, Axis , varsayılan olarak dünyanın Y ekseninde. |
RotateTrackball | Yol Topu rotasyonu, TrackballRadialPullFactor ve TrackballRollFactor özellikleri aracılığıyla daha da özelleştirilmiştir. |
BestForDevice | Farklı uçak veya oyun konsolu için çeviri uçağı veya oyun konsolu için çeviri konsolu için fare ve oyun konsolu için çeviri konsolu için 6DOF için VR. |
Scriptable | İstediğiniz hareketi SetDragStyleFunction() aracılığıyla sağlayan özel bir işlev aracılığıyla hesaplar. |
Yönü Çevir
Varsayılan olarak, 3D hareketi ve ilişkili DragStyle haritası dünya uzayına. Ancak, ReferenceInstance, Orientation veya 1>
Özellik | Açıklama | Varsayılan |
---|---|---|
ReferenceInstance | Bir pivot sağlayan referans çerçevesi ile kaydırıcıyı içerir. Class.DragDetector.DragFrame|DragFrame , bu referans çerçevesi ile ilgili DragFrame | nil |
Orientation | Hareketin referans çerçevesi (yönünü değiştirmez) ile ilgili YXZ dönmezini belirtir (yönünü değiştirmez). Lineer çeviri ve eksen dönmesi bu Y ekseninde olacak ve X eksenindeki planar çevirisi değiştirilece | (0, 0, 0) |
Axis | Hareketin temel eksen, referans çerçevesiye ifade edilmiştir. Bu değeri değiştirmek Orientation ve tersi günceller. | (0, 1, 0) |
Hareketinize Cevap
Class.DragDetector.ResponseStyle|ResponseStyle özelliği, bir nesnenin önerilen harekete nasıl yanıt verdiğini belirtir, objenin Anchored olup olmadığına bağlı olarak.
Ayarlar | Yerleşik Davranış | Sabitlenmemiş Davranış |
---|---|---|
Geometric | Koşullanan bir nesnenin pozisyonu/yönü Studio düzenleme modunda veya koşullanan bir nesnenin yerleştirilmiş olması durumunda güncellenecektir. | Bir bağlantı olmayan nesne için, davranış bağlantılı bir nesne için aynıdır. Ancak, bir yürüyen deneyimde, nesne bağlantılı olarak başlangıçta serbest bırakıldığında bağlanacaktır. |
Physical | Anchored bir nesne, güçlere etkilenmez, bu nedenle Geometrik davranışına varsayılır. | Anchored olmayan bir nesne, bağlayıcı güçler tarafından hareket edilecek ve/veya önerilen hareketin verilen istediği pozisyon ve/veya yönlendirmeye yönlendirilecek. |
Custom | Nesne hiç hareket etmeyecek, ancak DragFrame hala güncellenecek ve istediğiniz şekilde sürüklemeyi yanıtlayabilirsiniz ancak. | (yüklenmiş gibi) |
Eksen ve Hareket Sınırları
Varsayılan olarak, 3D hareketinin özelliklerinin ötesine geçerli sınırlar var değil. Eğer gerekirse, minimum ve maksimum sınırları her iki çevirim ve dönüşüm arasında uygulayabilirsiniz. Not, ancak, bunlar sınırlar değil; sadece hareket oluşturmaya çalışanlarınızı engeller.
Özellikler | Açıklama | Varsayılan |
---|---|---|
Class.DragDetector.MinDragTranslation|MinDragTranslation``Class.DragDetector.MaxDragTranslation|MaxDragTranslation | Her boyutta çeviri yapma sınırları. MaxDragTranslation daha düşükse, çeviri bu menzil içinde kıvrılacaktır. | (0, 0, 0) |
Class.DragDetector.MinDragAngle|MinDragAngle``Class.DragDetector.MaxDragAngle|MaxDragAngle | Sadece önemli if DragStyle RotateAxis ile ayarlanır. Eğer MaxDragAngle1> Class.DragDetector.MinDragAngle|MinDragAngle1> より büyükse, döndürme o menzilde içinde kıvrılacaktır. | 0 |
İzin Çekme
Oyuncuların belirli bir sürükleme algılayıcı instanzi ile etkileşim kurmasına izin verme izin içeriği PermissionPolicy özelliği tarafından belirlenebilir. Bu, varsayılan olarak Enum.DragDetectorPermissionPolicy.Everybody tarafından değiştirilebilir ve kod örneğinde gösterildiği gibi scriptli izin kontrollerini dest
Ayarlar | Açıklama |
---|---|
Nobody | Hiç kimse DragDetector ile etkileşime geçemez. |
Everybody | Tüm oyuncular DragDetector ile etkileşime geçebilir. |
Scriptable | Oyuncuların kaydırma izinleri SetPermissionPolicyFunction() aracılığıyla kaydedilen bir işlevle belirlenecek. Bu ayar altında, bir işlevi kaydetmeyi veya geçersiz bir sonuçu döndürmeyi reddetmeyen tüm oyuncular kaydırma yapmayacaktır. |
DragDetector - Scripted Drag İzin
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)
Fiziksel Yanıt
Bir kılıç efekti oluşturucusunun yanıt stilini Fiziksel olarak ayarladığını ve bir bağlantı olmayan nesneye uygulandığını varsayalım, o nesne, kılıç hareketi tarafından getirilen pozisyon/yönlendirmeye ulaşmaya çalışan kısıtlayıcı güçler aracılığıyla hareket
Özellik | Açıklama | Varsayılan |
---|---|---|
ApplyAtCenterOfMass | Kullanıcının tıkladığı noktada, kuvvet yanında kaydırma gücü uygulanır. Kullanıcının tıkladığı noktada, kuvvet merkezindeki nesneye uygulanır. | yanlış |
MaxForce | Hedefine ulaşması için uygulanan maksimum güç. | 100.000.000 |
MaxTorque | Hedefine ulaşması için uygulanan maksimum tork. | 10000 |
Responsiveness | Daha yüksek değerler, hedefe daha hızlı ulaşmasını sağlar. | 10 |
Değiştirici Girişi
Kopyalama
Class.DragDetector.RunLocally|RunLocally özelliği sahte (varsayılan) olduğunda, client tüm girişleri görüntüler veya işlemleri gerçekleştirmek için sunucuya gönderir. Bu modda, tüm özel etkinlik işaretleri ve kaydedilmiş işlevler sunucunun Scripts .
Class.DragDetector.RunLocally|RunLocally özelliği doğru olduğunda, sunucuya hiçbir etkinlik yeniden yansıtılmaz. Tüm özel etkinlik işaretleri ve kaydedilmiş işlevler LocalScripts ve kaydedilmiş değişiklikleri uzaktan etkinlikler olarak yayılmalıdır.
Tıklama ve Sürüklemeye Cevap Kodları
etkinlik işaretleri aracılığıyla, özellik değiştirmeleri, Scriptable çekme stilleri ve özel fonksiyonlar aracılığıyla, çekilen nesnelerin manipülasyonuna yanıt vererek UI'yi sürüklemeye veya mantıksal kararlar almaya, hafif bir duvar anahtarının parlaklığına gö
Etkinlik Sinyalleri
Aşağıdaki etkinlik işaretleri aracılığıyla, bir kullanıcının bir nesneyi sürüklemeyi başlatmasını, devam etmesini ve bitmesini tespit edebilirsiniz.
Etkinlik | Açıklama |
---|---|
DragStart | Bir kullanıcının nesneyi sürüklemeye başladığında ateşlenir. |
DragContinue | Kullanıcı, DragStart başlatıldıktan sonra nesneyi sürüklemeyi sürdürürse ateş eder. |
DragEnd | Bir kullanıcı nesneyi sürüklemeyi bıraktığında ateş eder. |
DragDetector - 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çevelerin Değiştirilmesini Sürükleme
etkinlik işaretleri dışında, DragFrame değişikliklerini 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)
Kodlanmış Sürükleme Tarzı
Bir dedektörün DragStyle 'ini Scriptable olarak ayarlarsanız, kendi işlevinizi sağlayabilirsiniz, bir Ray ı alır ve bir dünya alanı 1> Datatype.CFrame1> ınıza. Dedektör, hareketi hareket ettirir
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)
-- Raycast algılamasında kaydırılmış nesneyi 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ıtlayıcı Fonksiyonu
Göstergelerin yanı sıra gösterge ve yapıştırma hakkında yerleşik hareket kuralları yoktur, ancak göstergenin DragFrame önce uygulanmadan önce özelleştirilmiş sınır işlevlerini kaydedebilirsiniz. Örneğin, bir yuvarlak pozisyonuna etrafınd
DragDetector - Özel Kısıtlayıcı 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 = 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()
Kullanım Örneği
Sabitlenmeyen Fiziksel Objeler
Drag Detektörlerinin temel bir uygulaması, oyuncuların parçaları dikkatlice kaldırması gereken bir kule dengesi oyunudur. Tower Structure'nin şu andaki kule yapısında, her parça'nın varsayılan bir Class.DragDetector.DragStyle|DragStyle ile bir Class.DragDetector ile dikkatlice çekilmes
Yanlız Parçalı Sabit Modeller
Çoğunlukla bağlantılı olsa da, oyuncuların çekmesi mümkün olan birkaç çocuk parçaya/modelle kolayca oluşturabilir ve paylaşabilirsiniz. Örneğin, aşağıdaki masanın iki tane çekmeceyi vardır, bunların içinde ne olduğunu incelemek için açılabilir.
Göstergeleri ve Sınırları Sürükleme
Drag Detektörlerini Constraints ile birleştirebilirsiniz, örneğin bir marionette pelerini. Aşağıdaki yüklemede, kontrol cepheleri bağlantılı, vücut parçaları bağlantısız ve kısıtlayıcılar
3D Kullanıcı Arayüzleri
3D kullanıcı arayüzleri, parlaklığını bir kayar anahtarının parlaklığına göre ayarlayabilirsiniz, bö
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
-- Parçacık boyutunu ve hızını yer iletici X faktörüne göre ayarla
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 yer ile algılayıcı Z faktörüne göre 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)