Lançamento de Raio

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

Em seu nível mais básico, raycasting é o ato de enviar um raio invisível de um ponto Vector3 específico em uma direção definida com um comprimento definido.Uma vez lançado, você pode detectar se o raio atinge uma célula BasePart ou Terrain .

Lasers são disparados por orbes flutuantes, e o lançamento de raios determina se um laser atinge uma plataforma.Plataformas tocadas pelos lasers são destruídas temporariamente.

Você pode lançar um raio com o método WorldRoot:Raycast() ( Workspace:Raycast() ) de uma origem Vector3 em uma direção Vector3.

Lançamento de Raio Básico

local Workspace = game:GetService("Workspace")
local rayOrigin = Vector3.new(0, 0, 0)
local rayDirection = Vector3.new(0, -100, 0)
local raycastResult = Workspace:Raycast(rayOrigin, rayDirection)

Quando Aplicável, você pode calcular um vetor direcional desconhecido ( rayDirection ) usando um conhecido origem e destino .Isso é útil ao lançar um raio entre dois pontos que podem mudar, como de um personagem de um jogador para outro.

  1. A origem mais um vetor direcional indica o destino do raio:

    raioOrigin + direção do raio = destino do raio

  2. Subtraia rayOrigin de ambos os lados da equação:

    raioOrigin + direção do raioraioOrigin = destino do raioraioOrigin

  3. A direção do raio iguala o destino menos a origem:

    direção de raio = destino de raio - origem de raio


local Workspace = game:GetService("Workspace")
local rayOrigin = Workspace.TestOrigin.Position
local rayDestination = Workspace.TestDestination.Position
local rayDirection = rayDestination - rayOrigin
local raycastResult = Workspace:Raycast(rayOrigin, rayDirection)

Opções de filtro

WorldRoot:Raycast() aceita um objeto opcional RaycastParams que diz ao raycast para incluir ou excluir seletivamente determinados BaseParts , ignorar o material Água para Terrain ou usar um grupo de colisão.

ChaveDescrição
FilterDescendantsInstancesArray de objetos cujos descendentes são usados para filtrar candidatos de lançamento de raios
FilterTypeEnum.RaycastFilterType enum que determina como o FilterDescendantsInstances array é usado na operação de raycast.
  • Exclude — Cada BasePart é considerado exceto aqueles que são descendentes de objetos na matriz / lista.
  • Include — Apenas BaseParts que são descendentes de objetos na matriz são considerados.
IgnoreWaterBooleano que determina se o material Água é considerado ao lançar raios contra Terrain.
CollisionGroupNome da string do grupo de colisão usado para a operação de lançamento de raios.
Filtagem de Raycast

local Workspace = game:GetService("Workspace")
local rayOrigin = Vector3.zero
local rayDirection = Vector3.new(0, -100, 0)
local raycastParams = RaycastParams.new()
raycastParams.FilterDescendantsInstances = {script.Parent}
raycastParams.FilterType = Enum.RaycastFilterType.Exclude
raycastParams.IgnoreWater = true
local raycastResult = Workspace:Raycast(rayOrigin, rayDirection, raycastParams)

Detecção de acerto

Se a operação de lançamento de raio atingir uma célula elegível BasePart ou Terrain, um objeto RaycastResult é retornado contendo os resultados.Para testar um hit, confirme que o resultado não é nil e utilize as seguintes propriedades conforme necessário.

PropriedadeDescrição
InstanceA célula BasePart ou Terrain que o raio intersectou.
PositionVector3 posição da interseção entre o raio e o Instance .
DistanceDistância entre o ponto de origem do raio e o ponto de intersecção.
MaterialO Enum.Material da BasePart ou Terrain no ponto de intersecção.
NormalVector3 da normal do vetor do rosto intersecado.
Detecção de Ataque de Raio

local Workspace = game:GetService("Workspace")
local rayOrigin = Vector3.zero
local rayDirection = Vector3.new(0, -100, 0)
local raycastResult = Workspace:Raycast(rayOrigin, rayDirection)
if raycastResult then
print("Instance:", raycastResult.Instance)
print("Position:", raycastResult.Position)
print("Distance:", raycastResult.Distance)
print("Material:", raycastResult.Material)
print("Normal:", raycastResult.Normal)
else
warn("No raycast result!")
end