Базовое применение 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 -- привязываем аттачи к нашим объектам 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 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 -- указываем расположение
Красавчик, как всегда.