3D Sürükleme Sensörleri

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

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.

  1. In the Explorer window, hover over the Part, MeshPart , or 1> Class.Model1> and click the ⊕ button. A contextual menu displays.

  2. Menüden bir DragDetector ekleyin.

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

AyarlarAçıklama
TranslateLine1D hareketi, Axis , varsayılan olarak dünyanın Y ekseninde.
TranslatePlane2D hareketi, Axis , varsayılan olarak dünyanın XZ uçağı.
TranslatePlaneOrLine2D 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.
TranslateLineOrPlane1D hareketi Axis ve, modifier aktif olduğunda, uçağın Axis ile perpendiküler olarak 2D hareketi .
TranslateViewPlaneUç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.
RotateAxisRotasyon, Axis , varsayılan olarak dünyanın Y ekseninde.
RotateTrackballYol 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>

ÖzellikAçıklamaVarsayılan
ReferenceInstanceBir pivot sağlayan referans çerçevesi ile kaydırıcıyı içerir. Class.DragDetector.DragFrame|DragFrame , bu referans çerçevesi ile ilgili DragFramenil
OrientationHareketin 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)
AxisHareketin 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.

AyarlarYerleşik DavranışSabitlenmemiş Davranış
GeometricKoş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.
PhysicalAnchored 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.
CustomNesne 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.

ÖzelliklerAçıklamaVarsayılan
Class.DragDetector.MinDragTranslation|MinDragTranslation``Class.DragDetector.MaxDragTranslation|MaxDragTranslationHer 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|MaxDragAngleSadece ö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

AyarlarAçıklama
NobodyHiç kimse DragDetector ile etkileşime geçemez.
EverybodyTüm oyuncular DragDetector ile etkileşime geçebilir.
ScriptableOyuncuları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

ÖzellikAçıklamaVarsayılan
ApplyAtCenterOfMassKullanı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ış
MaxForceHedefine ulaşması için uygulanan maksimum güç.100.000.000
MaxTorqueHedefine ulaşması için uygulanan maksimum tork.10000
ResponsivenessDaha 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.

EtkinlikAçıklama
DragStartBir kullanıcının nesneyi sürüklemeye başladığında ateşlenir.
DragContinueKullanıcı, DragStart başlatıldıktan sonra nesneyi sürüklemeyi sürdürürse ateş eder.
DragEndBir 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)