Em seu nível mais básico, raiocasting é o ato de enviar um raio invisível de um ponto Vector3 em uma direção específica com um comprimento definido. Uma vez lançado, você pode detectar se o raio atinge uma BasePart ou célula de Terrain.
Você pode lançar um raio com o método WorldRoot:Raycast() (Workspace:Raycast()) de uma origem Vector3 em uma direção Vector3.
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 uma origem e destino conhecidos. Isso é útil ao lançar um raio entre dois pontos que podem mudar, como de um personagem jogador para outro.
A origem mais um vetor direcional indica o destino do raio:
Subtraia de ambos os lados da equação:
A direção do raio é igual ao destino menos a origem:
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 informa ao raiocasting para incluir ou excluir seletivamente certas BaseParts, ignorar o material Water para Terrain, ou usar um grupo de colisão.
| Chave | Descrição |
|---|---|
| FilterDescendantsInstances | Array de objetos cujos descendentes são usados na filtragem de candidatos a raiocasting. |
| FilterType | Enum Enum.RaycastFilterType que determina como o array FilterDescendantsInstances é usado na operação de raiocasting. |
| IgnoreWater | Booleano que determina se o material Water é considerado ao raiocar contra Terrain. |
| CollisionGroup | Nome da string do grupo de colisão usado para a operação de raiocasting. |
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 impacto
Se a operação de raiocasting atingir uma BasePart ou célula de Terrain elegível, um objeto RaycastResult é retornado contendo os resultados. Para testar se houve uma colisão, confirme que o resultado não é nil e utilize as seguintes propriedades conforme necessário.
| Propriedade | Descrição |
|---|---|
| Instance | A BasePart ou célula de Terrain que o raio intersectou. |
| Position | Posição Vector3 da interseção entre o raio e a Instance. |
| Distance | Distância entre a origem do raio e o ponto de interseção. |
| Material | O Enum.Material da BasePart ou Terrain no ponto de interseção. |
| Normal | Vector3 do vetor normal da face intersectada. |
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("Instância:", raycastResult.Instance)
print("Posição:", raycastResult.Position)
print("Distância:", raycastResult.Distance)
print("Material:", raycastResult.Material)
print("Normal:", raycastResult.Normal)
else
warn("Nenhum resultado de raiocasting!")
end