3B sürükleme dedektö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.

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:

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

  1. Araştırıcı penceresinde, , veya üzerine gelin ve ⊕ düğmesine tıklayın. Bir bağımsız menü görüntülenir.

  2. Menüden, bir Sürükleyici Dedektörü ekleyin.

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

AyarlamaAçıklama
TranslateLineDedektörün Axis boyunca 1D hareketi, varsayılan olarak dünya Y eksen.
TranslatePlaneDedektörün Axis 'ine perpendikal olan uçakta 2B hareketi, varsayılan olarak dünya XZ uçağı.
TranslatePlaneOrLineDedektörün Axis 'sine perpendikal olan 2B hareketi ve modifiye edici aktif olduğunda, dedektörün Axis boyunca 1D hareketi.
TranslateLineOrPlaneDedektörün Axis boyunca 1D hareketi ve modifiye edici aktif olduğunda, dedektörün Axis eşit yönde 2D hareketi.
TranslateViewPlaneKameranı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.
RotateAxisDedektörün Axis hakkındaki dönüş, varsayılan olarak dünya Y eksenidir.
RotateTrackballTrackball 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.

ÖzellikAçıklamaVarsayılan
ReferenceInstanceEkseninin 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
OrientationReferans ç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)
AxisReferans ç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.

AyarlamaSabit davranışSabitlenmemiş davranış
GeometricKoş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.
PhysicalKilitli 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.
CustomNesne 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.

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

AyarlamaAçıklama
NobodyHiçbir oyuncu ile DragDetector 'ye etkileşemez.
EverybodyTüm oyuncular DragDetector ile etkileşebilir.
ScriptableOyuncuları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:

ÖzellikAçıklamaVarsayılan
ApplyAtCenterOfMassYanlış olduğunda, kullanıcının tıkladığı noktada kuvvet uygulanır. Doğru olduğunda, kuvvet objenin kütle merkezine uygulanır.sahte
MaxForceNesneye ulaşması için uygulanan maksimum güç.10000000
MaxTorqueHedefine ulaşmak için nesne için uygulanan maksimum tork.10000
ResponsivenessDaha 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.

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