Думаете так просто найти по этой ерунде информацию? Как бы не так. Искал варианты Raycast и прочие векторные фигни… И вот… Чисто случайно наткнулся на Beam в документации:
https://developer.roblox.com/en-us/api-reference/class/Beam
Осталось малость — забахать из этого целе-указующий перст.
Согласно описанию: нужны две точки на рабочем пространстве. Не страшно: одна будет бошка гуманоида (head присутствует как в новых моделях, так и в старых), вторая — стартовая позиция.
Берём скрипты из документации и допиливаем. Ах да, это обычный скрипт, который так же размещается в Workspace.
-- стрелки к месту старта
shared["BeamToStart"]=function(pos)
local v1
local v2
v1=Vector3.new(pos.Position.X,pos.Position.Y+2,pos.Position.Z)
-- print(v1.Magnitude)
if v1.Magnitude < shared.SizeGround/2 then
wait(1)
return -- если возле деревни, то указатель нам не нужен
end
-- create attachments
local att0 = Instance.new("Attachment")
local att1 = Instance.new("Attachment")
-- parent to terrain (can be part instead)
att0.Parent = workspace.Terrain
att1.Parent = workspace.Terrain
v2=v1-v1.Unit*1 -- ограничиваем длинну в 10 юнитов в направлении куда
att0.Position = v1
att1.Position = v2
-- create beam
local beam = Instance.new("Beam")
beam.Attachment0 = att0
beam.Attachment1 = att1
-- appearance properties
beam.Color = ColorSequence.new({ -- a color sequence shifting from white to blue
ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 255, 255)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(0, 255, 255))
}
)
beam.LightEmission = 1 -- use additive blending
beam.LightInfluence = 1 -- beam not influenced by light
beam.Texture = "rbxassetid://139707616" -- a built in sparkle texture
beam.TextureMode = Enum.TextureMode.Wrap -- wrap so length can be set by TextureLength
beam.TextureLength = 1 -- repeating texture is 1 stud long
beam.TextureSpeed = 0 -- slow texture speed 1
beam.Transparency = NumberSequence.new({ -- beam fades out at the end
NumberSequenceKeypoint.new(0, 0),
NumberSequenceKeypoint.new(0.8, 0),
NumberSequenceKeypoint.new(1, 1)
}
)
beam.ZOffset = 0 -- render at the position of the beam without offset
beam.FaceCamera = true -- beam is visible from every angle
beam.Segments = 5 -- default curve resolution
beam.Width0 = 2 -- starts small
beam.Width1 = 1 -- ends big
-- parent beam
beam.Enabled = true
beam.Parent = att0
wait() -- делаем паузу чтобы не зависало!
beam.Enabled = false
end
-- Будем запускать привязав к игрокам - новым и после респавна
local Players = game:GetService("Players")
local function onCharacterAdded(character)
-- Give them sparkles on their head if they don't have them yet
--if not character:FindFirstChild("Sparkles") then
local part
while true do
part = character:WaitForChild("Head")
shared.BeamToStart(part)
end
--end
end
local function onPlayerAdded(player)
-- Check if they already spawned in
if player.Character then
onCharacterAdded(player.Character)
end
-- Listen for the player (re)spawning
player.CharacterAdded:Connect(onCharacterAdded)
end
-- Iterate over each player already connected
-- to the game using a generic for-loop
for i, player in pairs(Players:GetPlayers()) do
onPlayerAdded(player)
end
-- Listen for newly connected players
Players.PlayerAdded:Connect(onPlayerAdded)
Отходим от деревни и наслаждаемся картинкой:

И как всегда, увидеть это в работе можно в игре:
https://www.roblox.com/games/4587789852/NecroWorld