Detectores de 3D Drag

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

A instância DragDetector facilita e incentiva a interação com objetos 3D em uma experiência, como abrir portas e gavetas, deslizar uma parte ao redor, agarrar e jogar uma bola de boliche, puxar e disparar uma arma de arremesso e muito mais. Os recursos-chave incluem:

  • Coloque um DragDetector sob qualquer BasePart ou Model para 2> torná-lo arrastável2> via todos os controles (mouse, Touch, controle / controle de jogoe VR), sem uma única linha de código.

  • Escolha entre vários estilos de arrastar, defina como o objeto responde às mudanças e, opcionalmente, aplique limites de eixo ou de movimento.

  • Scripts podem responder à manipulação de objetos arrastados para dirigir a UI ou tomar decisões lógicas, como ajustar o nível de luz em uma sala com base em um dimmer de interruptor de parede deslizante.

  • Os jogadores podem manipular peças ou modelos ancorados e eles permanecerão exatamente onde você os colocou ao liberar.

  • Class.DragDetector|DragDetectors trabalha no Studio tanto quanto você estiver usando a ferramenta Selecionar , Mover , 0> Redimensionar0> ou DragDetectors3> ferramentas, tornando mais fácil testar e ajustar objetos arrastáveis enquanto estiver editando.

Tornando Objetos Dragáveis

Para fazer qualquer peça ou modelo arrastável, basta adicionar um DragDetector como Descendentedireto.

  1. Na janela Explorer, passe o mouse sobre o Part, MeshPart ou 2>Class.Model2> e clique no botão ⊕. Um menu contextual será exibido.

  2. Do menu, insira um DragDetector .

  3. Por padrão, o objeto agora será arrastável no plano de terra, mas você pode personalizar seu DragStyle , definir como ele responde ao movimento e, opcionalmente, aplicar limites de eixo ou de movimento.

Personalizando Detector de Arrastamento

Estilo de arrastamento

DragDetectors map cursor motion to virtual lines and planes to calculate proposed 3D motion. Through the DragStyle propriedade, you can choose from different mappings to suit your needs. Por exemplo, TranslatePlane produz tradução em um plano virtual, enquanto 0> RotateAxis 0> produz rotação em

ConfigurandoDescrição
TranslateLine1D movimento ao longo do eixo Axis , por padrão, o mundo Y eixo.
TranslatePlaneMovimento 2D no plano perpendicular ao detector's Axis , por padrão o mundo XZ plano.
TranslatePlaneOrLine2D de movimento no plano perpendicular ao detector's Axis e, quando o modificador estiver ativo, 1D de movimento ao longo do detector's Axis.
TranslateLineOrPlane1D movimento ao longo do eixo Axis e, quando o modificador estiver ativo, 2D movimento no plano perpendicular ao eixo Axis do detector.
TranslateViewPlaneMovimento 2D no plano perpendicular à verda Câmera. Neste modo, o plano é atualizado constantemente, mesmo ao arrastar, e sempre estará em frente à veratual da Câmera.
RotateAxisRotação em torno do detector's Axis , por padrão o mundo's eixo Y.
RotateTrackballRotação de bola de pau, mais personalizada através das propriedades TrackballRadialPullFactor e TrackballRollFactor.
BestForDevice TraduzirPlanoOrLine para mouse e controle / controle de jogo; TraduzirPlano para toque; 6DOF para VR.
ScriptableCalcula a movimentação desejada via uma função personalizada fornecida através de SetDragStyleFunction() .

Direção de arrastamento

Por padrão, 3D motion e o mapa associado DragStyle para o espaço mundial. No entanto, você pode querer alterar o ReferenceInstance , Orientation ou 1>

PropriedadeDescriçãoPadrão
ReferenceInstanceUma instância cujo pivô fornece o quadro de referência para o detector de arrastamento. O DragFrame é expresso relativo a este quadro de referência que pode ser recuperado via Class.DragDetector:GetReferenceFrame()|GetReferenceFrame()nil
OrientationEspecifica a YXZ rotação de eixos de movimento em relação à referência (não altera a orientação da referência). A tradução linear e a rotação axial estarão neste eixo de referência Y , e a tradução plana na plano XZ . A alteração deste valor atualiza automaticamente 1> Class.DragDetector.Axis|Axis1> e(0, 0, 0)
AxisO eixo principal de movimento, expresso em relação à referência. Alterar este valor atualiza automaticamente Orientation e vice-versa.(0, 1, 0)

Resposta à Motion

A propriedade ResponseStyle especifica como um objeto responde à proposta de movimento, dependendo se o objeto estiver Anchored ou não.

ConfigurandoComportamento AncoradoComportamento não ancorado
GeometricSowohl dentro da experiência em execução quanto no modo de edição do Studio, a posição/orientação de um objeto ancorado será atualizada para refletir exatamente o movimento proposto.Para um Objetonão ancorado, o comportamento é o mesmo que para um Objetoancorado. No entanto, em uma experiência em andamento, o objeto será ancorado na inicialização do arrastamento e restaurado ao desarrancar.
PhysicalUm objeto ancorado padrão será definido para o comportamento Geométrico , pois não é afetado por forças.Um objeto não ancorado será movido por forças de restrição que tentam levá-lo à posição e/ou orientação desejadas dadas pela proposta de movimento.
CustomO objeto não se moverá de todas / todos, mas DragFrame ainda será atualizado e você pode responder à manipulação de arrastamento como você quiser.(mesmo que ancorado)

Limites de Eixo & Movimento

Por padrão, não há limites para a movimentação 3D além das restrições intrínsecas do DragStyle. Se necessário, você pode aplicar limites mínimos e máximos para ambas a tradução e rotação. Observe, no entanto, que estes não são limites; eles apenas impedem que o detector de arrastamento gere movimento para permanecer dentro dos limites.

PropriedadesDescriçãoPadrão
Class.DragDetector.MinDragTranslation|MinDragTranslation``Class.DragDetector.MaxDragTranslation|MaxDragTranslationLimites para arrastar a tradução em cada dimensão. Se a MaxDragTranslation for maior que a MinDragTranslation, a tradução será pressionada dentro desse alcance.(0, 0, 0)
Class.DragDetector.MinDragAngle|MinDragAngle``Class.DragDetector.MaxDragAngle|MaxDragAngleApenas relevante se DragStyle estiver definido para RotateAxis . Se MaxDragAngle for maior que 1> Class.DragDetector.MinDragAngle|MinDragAngle1>, a rotação será ajustada dentro desse alcance.0

Segurar Permissão

A permissão de jogadores para interagir com uma instância de detector de arrastamento dado pode ser especificada pela propriedade PermissionPolicy. Isso é definido como Enum.DragDetectorPermissionPolicy.Everybody por padrão, e também pode ser alterado para suportar controles de permissão scriptados, como mostrado no exemplo de código.

ConfigurandoDescrição
NobodyNenhum jogador pode interagir com o DragDetector.
EverybodyTodos os jogadores podem interagir com o DragDetector.
ScriptableAs permissões de arrastamento dos jogadores serão determinadas por uma função registrada através de SetPermissionPolicyFunction(). Sob esta configuração, o não-registro de uma função ou o retorno de um resultado inválido impedirá que todos os jogadores arrastem.
DragDetector - Permissão de Dragão Script

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)

Resposta de Física

Assumir que o estilo de resposta de um draguer está definido como Físico e é aplicado a um Objetonão ancorado, que objeto será movido por forças de restrição que tentam levá-lo à posição/orientação dada pelo movimento proposto. Você pode personalizar melhor o resposta física através das seguintes propriedades:

PropriedadeDescriçãoPadrão
ApplyAtCenterOfMassQuando falso, a força de arrastamento é aplicada no ponto em que o usuário clica. Quando verdadeiro, a força é aplicada no centro de massa do Objeto.falso
MaxForceForça máxima aplicada para o objeto alcançar seu objetivo.10000000
MaxTorqueMáximo de torque aplicado para o objeto alcançar seu objetivo.10000
ResponsivenessValores mais altos fazem com que o objeto alcance seu objetivo mais rapidamente.10

Entrada de Modificador

Replicação

Quando a propriedade RunLocally é falsa (por padrão), o cliente interpreta todo o entrada para produzir dados que envia para o servidor para executar o arrastamento. Neste modo, todos os sinais de evento personalizados e funções registradas devem estar no servidor Scripts.

Quando a propriedade RunLocally é verdadeira, nenhum evento é replicado para o servidor. Todos os sinais de eventos personalizados e funções registradas devem estar em LocalScripts e você deve usar eventos remotos para propagar as alterações necessárias ao servidor.

Scripting Responses ao Clicar e Segurar

Através de sinais de eventos , propriedades de mudança de propriedade, Scriptable estilo de arrastamento de script e personalizações, scripts podem responder à manipulação de objetos arrastados para direcionar a interface ou tomar decisões lógicas, como ajustar o nível de luz em uma sala com base em um interruptor de parede deslizante.

Sinais de Evento

Através dos seguintes sinais de evento, você pode detectar quando um usuário começa, continua e termina a arrastar um Objeto.

EventoDescrição
DragStartDispara quando um usuário começa a arrastar o Objeto.
DragContinueOcorre quando um usuário continua arrastando o objeto depois que DragStart foi iniciado.
DragEndDispara quando um usuário para de arrastar o Objeto.
DragDetector - Sinais de Evento

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)

Mover as Mudanças de Quadro

Além de sinais de eventos, você pode monitorar alterações no DragFrame diretamente.

DragDetector - Mudanças em DragFrame

local dragDetector = script.Parent.DragDetector
dragDetector:GetPropertyChangedSignal("DragFrame"):Connect(function()
local currentDragTranslation = dragDetector.DragFrame.Position
print(currentDragTranslation)
end)

Estilo de arrastamento scripts

Se você definir um detector's DragStyle para Scriptable , você pode fornecer sua própria função que recebe um Ray e retorna um espaço de mundo 1> Datatype.CFrame1> . O detector moverá o movimento para que o objeto拖动 vá para essa localização personalizada / orientação.

DragDetector - Estilo de Drag

local dragDetector = script.Parent.DragDetector
dragDetector.DragStyle = Enum.DragDetectorDragStyle.Scriptable
local cachedHitPoint = Vector3.zero
local cachedHitNormal = Vector3.yAxis
local function followTheCursor(cursorRay)
-- Excluir objeto arrastado da detecção de raycast
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)

Função de Con約束 Personalizada

Detectores de arrastamento não têm regras de movimento incorporadas sobre redes e encaixe, mas você pode registrar funções de limite personalizadas para editar o detector's DragFrame antes de ser aplicado. Por exemplo, você pode manter o movimento em uma grade ao redor de posições para multiplicar o incremento da grade ou simular um jogo de xadrez com regras de movimento legais para cada peça.

DragDetector - Função de Con約束 Personalizada

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()

Exemplo de Uso

Objetos Físicos Sem Ancoras

Uma implementação básica de detectores de arrastamento é um jogo de equilíbrio de torre onde os jogadores devem remover cuidadosamente peças e tentar manter a torre erguida. Na seguinte estrutura da torre, cada peça tem uma filha DragDetector com um padrão DragStyle de TranslatePlane para que os jog

Modelos Anchored com Partes Ajustáveis

Você pode facilmente criar e compartilhar modelos que são principalmente ancorados, mas que têm uma ou mais peças/modelos filhos que os jogadores podem arrastar. Por exemplo, a seguinte mesa tem dois gavetas que os jogadores podem abrir para inspeção do que tem dentro.

Arrastar Detector e Con約束

Você pode combinar detectores de arrastamento com Constraints, por exemplo, uma boneca de marionete. No seguinte setup, as alças de controle são ancoradas, as partes do corpo são desancoradas e os limites prendem a marionete juntos. Mover as alças com o TranslateViewPlane

Interfaces de Usuário 3D

As interfaces de usuário 3D são facilmente alcançáveis através de detectores de arrastamento, como ajustar a brilhance de um SpotLight baseado

DragDetector - Interface de Usuário 3D

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
-- Ajuste o tamanho e a velocidade das partículas com base no multiplicador de X do detector de arrastamento
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)
-- Ajustar a cor da partícula com base no fator Z do detector de arrastamento
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)