Блог школы Роблоппа — Роблокс Студио, обучение, познавательные статьи и новости школы

Dot в Роблокс Студио: как определить направление и угол между объектами

Документация
В Роблокс Студио при создании игр часто возникает задача определить, в каком направлении смотрит объект, находится ли игрок перед NPC или попадает ли объект в поле зрения.
Для этого используется метод Dot — один из самых важных инструментов в работе с векторами.

Что такое Dot в Роблокс Студио

Dot — это метод векторной математики:
Vector3:Dot(otherVector)
Он возвращает число, которое показывает, насколько два вектора направлены в одну сторону.
Проще говоря, Dot отвечает на вопрос:
Смотрят ли два направления в одну сторону и насколько сильно?

Почему Dot так важен в играх

Dot используется в играх для:
  • логики зрения NPC;
  • определения угла между объектами;
  • проверки, находится ли игрок перед персонажем;
  • ИИ противников и охранников;
  • камер, прицеливания и взаимодействий.
Без Dot невозможно корректно реализовать механику «NPC видит игрока».

Как работает Dot простыми словами

Представь два вектора как стрелки:
  • если стрелки направлены в одну сторону → результат положительный;
  • если они перпендикулярны → результат 0;
  • если направлены в противоположные стороны → результат отрицательный.

Значения Dot и их смысл

⚠️ Эти значения актуальны, если векторы нормализованы с помощью .Unit.
Значение Dot
Что это значит
1
Полное совпадение направления
0.7
Примерно 45°
0.5
Примерно 60°
0
Угол 90°
-1
Противоположные направления

Почему важно использовать .Unit

Одна из самых частых ошибок — забыть .Unit.
❌ Неправильно:
local dot = vectorA:Dot(vectorB)
✅ Правильно:
local dot = vectorA.Unit:Dot(vectorB.Unit)
.Unit делает вектор длиной 1, и Dot начинает показывать только направление, а не расстояние.

Простой пример с векторами

local a = Vector3.new(1, 0, 0).Unit
local b = Vector3.new(1, 0, 0).Unit

print(a:Dot(b)) -- 1
Оба вектора смотрят вправо — направления совпадают.

Как определить, находится ли объект перед другим

Это самый популярный сценарий использования Dot.
local npcRoot = npc.HumanoidRootPart
local npcLook = npcRoot.CFrame.LookVector

local toPlayer = (playerRoot.Position - npcRoot.Position).Unit
local dot = npcLook:Dot(toPlayer)

if dot > 0.7 then
print("Игрок перед NPC")
end

Что здесь происходит:

  • LookVector — направление взгляда NPC;
  • toPlayer — направление от NPC к игроку;
  • Dot сравнивает эти направления.
Если значение больше 0.7, игрок находится в зоне видимости.

Связь Dot и угла

Хотя Dot возвращает число, его можно воспринимать как приблизительный угол:
  • Dot ≈ 1 — объект прямо перед нами;
  • Dot ≈ 0 — объект сбоку;
  • Dot < 0 — объект за спиной.
Это намного удобнее, чем вычислять угол через тригонометрию.

🚀 Хочешь научиться писать свои скрипты с нуля?

Запишись на обучение по Роблокс Студио на сайте roblo.ru
Ты узнаешь, как создавать игры, интерфейсы и программировать события — шаг за шагом!
Made on
Tilda