Думаете так просто найти по этой ерунде информацию? Как бы не так. Искал варианты 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