Базовое применение Beam это указать игроку куда идти дальше. Но это далеко не единственное применение данного инструмента .
Но сегодня у меня спросили как именно сделать данный указатель, поэтому это мы и разберём.
Итак, сперва теория. Beam — это луч соединяющий две точки. В случае усложнения, это кривая Безье с дополнительными параметрами: кривизны, размеров и другими…
Получаем, что нам нужно определиться с этими точками.
центр персонажа (торс)
центр локации (место резервирования территории)
Далее нам нужна.. текстура со стрелкой. (Забегая вперёд скажу что нам нужна стрелка вниз.)
Подойдёт любая.
Переходим к коду. Мы уже определились где будут находиться точки. А значит, к нашим объектам (цель и игрок) надо прицепить аттачи и создать на их основе луч. И вот тут сразу нюанс это не нужно видеть всем игрокам, а значит это будет происходить на стороне клиента и как следствие это будет LocalScript. Т.к. у нас это тестовое задание, то поместим этот скрипт в StarterCharacterScripts. Он должен будет у нас запуститься, только когда появится персонаж. А чтобы не задавать кучу условий и отслеживаний событий мы его и помещаем в зону скриптов, что выполняется только при появлении перса.
local Players = game: GetService ( "Players" ) -- сервис работоы с игроками
local player = Players.LocalPlayer -- получение игрока на клиенте
local character = player.Character -- получение персонажа игрока
local attach0 = character: WaitForChild ( "HumanoidRootPart" ) -- место выхода луча
local attach1 = game.Workspace.Target -- указатель цели
local att0 = Instance. new ( "Attachment" ) -- создаём сами аттачи
local att1 = Instance. new ( "Attachment" )
att0.Parent = attach0 -- привязываем аттачи к нашим объектам
local beam = Instance. new ( "Beam" ) -- создаём луч
beam.Texture = "rbxassetid://2557513411" -- задаём текстуру луча
beam.TextureMode = Enum.TextureMode.Wrap -- вариант текстурирования
beam.TextureSpeed = 2 -- скорость движения стрелок
beam.Transparency = NumberSequence.new {
NumberSequenceKeypoint. new ( 0, 0 ) ,
NumberSequenceKeypoint. new ( 1, 0 )
} -- прозрачность текстуры
beam.Brightness = 10 -- свечение текстуры
beam.LightEmission = 0 -- смешение с цветами окружения
beam.LightInfluence = 0 -- смешение с освещением вокруг
beam.FaceCamera = false -- не зависитеть от от угла зрения перса
beam.Segments = 1 -- повторений текстур в в блоке
beam.Enabled = true -- активируем луч
beam.Parent = att0 -- указываем расположение
local Players = game:GetService("Players") -- сервис работоы с игроками
local player = Players.LocalPlayer -- получение игрока на клиенте
local character = player.Character -- получение персонажа игрока
local attach0 = character:WaitForChild("HumanoidRootPart") -- место выхода луча
local attach1 = game.Workspace.Target -- указатель цели
local att0 = Instance.new("Attachment") -- создаём сами аттачи
local att1 = Instance.new("Attachment")
att0.Parent = attach0 -- привязываем аттачи к нашим объектам
att1.Parent = attach1
local beam = Instance.new("Beam") -- создаём луч
beam.Attachment0 = att0
beam.Attachment1 = att1
beam.Texture = "rbxassetid://2557513411" -- задаём текстуру луча
beam.TextureMode = Enum.TextureMode.Wrap -- вариант текстурирования
beam.TextureSpeed = 2 -- скорость движения стрелок
beam.Transparency = NumberSequence.new{
NumberSequenceKeypoint.new(0, 0),
NumberSequenceKeypoint.new(1, 0)
} -- прозрачность текстуры
beam.Brightness = 10 -- свечение текстуры
beam.LightEmission = 0 -- смешение с цветами окружения
beam.LightInfluence = 0 -- смешение с освещением вокруг
beam.FaceCamera = false -- не зависитеть от от угла зрения перса
beam.Segments = 1 -- повторений текстур в в блоке
beam.Enabled = true -- активируем луч
beam.Parent = att0 -- указываем расположение
local Players = game:GetService("Players") -- сервис работоы с игроками
local player = Players.LocalPlayer -- получение игрока на клиенте
local character = player.Character -- получение персонажа игрока
local attach0 = character:WaitForChild("HumanoidRootPart") -- место выхода луча
local attach1 = game.Workspace.Target -- указатель цели
local att0 = Instance.new("Attachment") -- создаём сами аттачи
local att1 = Instance.new("Attachment")
att0.Parent = attach0 -- привязываем аттачи к нашим объектам
att1.Parent = attach1
local beam = Instance.new("Beam") -- создаём луч
beam.Attachment0 = att0
beam.Attachment1 = att1
beam.Texture = "rbxassetid://2557513411" -- задаём текстуру луча
beam.TextureMode = Enum.TextureMode.Wrap -- вариант текстурирования
beam.TextureSpeed = 2 -- скорость движения стрелок
beam.Transparency = NumberSequence.new{
NumberSequenceKeypoint.new(0, 0),
NumberSequenceKeypoint.new(1, 0)
} -- прозрачность текстуры
beam.Brightness = 10 -- свечение текстуры
beam.LightEmission = 0 -- смешение с цветами окружения
beam.LightInfluence = 0 -- смешение с освещением вокруг
beam.FaceCamera = false -- не зависитеть от от угла зрения перса
beam.Segments = 1 -- повторений текстур в в блоке
beam.Enabled = true -- активируем луч
beam.Parent = att0 -- указываем расположение
Вот и результат:
Что бы создать ещё одну стрелку, нам просто нужно создать ещё один аттач цели и копию готового луча.
local Players = game: GetService ( "Players" ) -- сервис работоы с игроками
local player = Players.LocalPlayer -- получение игрока на клиенте
local character = player.Character -- получение персонажа игрока
local attach0 = character: WaitForChild ( "HumanoidRootPart" ) -- место выхода луча
local attach1 = game.Workspace.Target -- указатель цели
local att0 = Instance. new ( "Attachment" ) -- создаём сами аттачи
local att1 = Instance. new ( "Attachment" )
att0.Parent = attach0 -- привязываем аттачи к нашим объектам
local beam = Instance. new ( "Beam" ) -- создаём луч
beam.Texture = "rbxassetid://2557513411" -- задаём текстуру луча
beam.TextureMode = Enum.TextureMode.Wrap -- вариант текстурирования
beam.TextureSpeed = 2 -- скорость движения стрелок
beam.Transparency = NumberSequence.new {
NumberSequenceKeypoint. new ( 0, 0 ) ,
NumberSequenceKeypoint. new ( 1, 0 )
} -- прозрачность текстуры
beam.Brightness = 10 -- свечение текстуры
beam.LightEmission = 0 -- смешение с цветами окружения
beam.LightInfluence = 0 -- смешение с освещением вокруг
beam.FaceCamera = false -- не зависитеть от от угла зрения перса
beam.Segments = 1 -- повторений текстур в в блоке
beam.Enabled = true -- активируем луч
beam.Parent = att0 -- указываем расположение
------------------------------------------------------------------------------------
local attach2 = game.Workspace.Target2 -- указатель цели
local att2 = Instance. new ( "Attachment" )
local beam2 = beam: Clone () -- клон готового
beam2.Attachment1 = att2 -- замена цели
beam2.Enabled = true -- активируем луч
beam2.Parent = att0 -- указываем расположение
local Players = game:GetService("Players") -- сервис работоы с игроками
local player = Players.LocalPlayer -- получение игрока на клиенте
local character = player.Character -- получение персонажа игрока
local attach0 = character:WaitForChild("HumanoidRootPart") -- место выхода луча
local attach1 = game.Workspace.Target -- указатель цели
local att0 = Instance.new("Attachment") -- создаём сами аттачи
local att1 = Instance.new("Attachment")
att0.Parent = attach0 -- привязываем аттачи к нашим объектам
att1.Parent = attach1
local beam = Instance.new("Beam") -- создаём луч
beam.Attachment0 = att0
beam.Attachment1 = att1
beam.Texture = "rbxassetid://2557513411" -- задаём текстуру луча
beam.TextureMode = Enum.TextureMode.Wrap -- вариант текстурирования
beam.TextureSpeed = 2 -- скорость движения стрелок
beam.Transparency = NumberSequence.new{
NumberSequenceKeypoint.new(0, 0),
NumberSequenceKeypoint.new(1, 0)
} -- прозрачность текстуры
beam.Brightness = 10 -- свечение текстуры
beam.LightEmission = 0 -- смешение с цветами окружения
beam.LightInfluence = 0 -- смешение с освещением вокруг
beam.FaceCamera = false -- не зависитеть от от угла зрения перса
beam.Segments = 1 -- повторений текстур в в блоке
beam.Enabled = true -- активируем луч
beam.Parent = att0 -- указываем расположение
------------------------------------------------------------------------------------
-- второй луч
local attach2 = game.Workspace.Target2 -- указатель цели
local att2 = Instance.new("Attachment")
att2.Parent = attach2
local beam2 = beam:Clone() -- клон готового
beam2.Attachment1 = att2 -- замена цели
beam2.Enabled = true -- активируем луч
beam2.Parent = att0 -- указываем расположение
local Players = game:GetService("Players") -- сервис работоы с игроками
local player = Players.LocalPlayer -- получение игрока на клиенте
local character = player.Character -- получение персонажа игрока
local attach0 = character:WaitForChild("HumanoidRootPart") -- место выхода луча
local attach1 = game.Workspace.Target -- указатель цели
local att0 = Instance.new("Attachment") -- создаём сами аттачи
local att1 = Instance.new("Attachment")
att0.Parent = attach0 -- привязываем аттачи к нашим объектам
att1.Parent = attach1
local beam = Instance.new("Beam") -- создаём луч
beam.Attachment0 = att0
beam.Attachment1 = att1
beam.Texture = "rbxassetid://2557513411" -- задаём текстуру луча
beam.TextureMode = Enum.TextureMode.Wrap -- вариант текстурирования
beam.TextureSpeed = 2 -- скорость движения стрелок
beam.Transparency = NumberSequence.new{
NumberSequenceKeypoint.new(0, 0),
NumberSequenceKeypoint.new(1, 0)
} -- прозрачность текстуры
beam.Brightness = 10 -- свечение текстуры
beam.LightEmission = 0 -- смешение с цветами окружения
beam.LightInfluence = 0 -- смешение с освещением вокруг
beam.FaceCamera = false -- не зависитеть от от угла зрения перса
beam.Segments = 1 -- повторений текстур в в блоке
beam.Enabled = true -- активируем луч
beam.Parent = att0 -- указываем расположение
------------------------------------------------------------------------------------
-- второй луч
local attach2 = game.Workspace.Target2 -- указатель цели
local att2 = Instance.new("Attachment")
att2.Parent = attach2
local beam2 = beam:Clone() -- клон готового
beam2.Attachment1 = att2 -- замена цели
beam2.Enabled = true -- активируем луч
beam2.Parent = att0 -- указываем расположение
Красавчик, как всегда.