🔍Що таке Vector3.Distance і чому не завжди варто використовувати його?
По суті, це звичайна відстань між двома точками у просторі. Ніби ти вимірюєш рулеткою відстань між двома об’єктами у світі гри.
Використання цього методу дуже поширене, адже у геймдеві постійно треба перевіряти, чи близько ворог до гравця, чи потрапив куля в ціль, або де найближчий чекпоінт.
🧠 Як працює Vector3.Distance?
де
І тут виникає підводний камінь — квадратний корінь це дорога операція для процесора. Хоча різниці практично нема. Просто як цікавий факт 💡
⚡️ Оптимальна альтернатива використання квадрату відстані:
🎯 Де це корисно?
Наприклад, коли потрібно перевірити, чи об’єкт знаходиться в межах певного радіусу — точне значення відстані не потрібне:
⚡️ Так ми уникаємо виклику
💻 | GAMEDEV UA | #уроки #unitytips #vector #distance #squaredistance
Vector3.Distance — це дуже зручний метод, який допомагає дізнатись, наскільки далеко одна точка (вектор) знаходиться від іншої у 3D-просторі.По суті, це звичайна відстань між двома точками у просторі. Ніби ти вимірюєш рулеткою відстань між двома об’єктами у світі гри.
Використання цього методу дуже поширене, адже у геймдеві постійно треба перевіряти, чи близько ворог до гравця, чи потрапив куля в ціль, або де найближчий чекпоінт.
🧠 Як працює Vector3.Distance?
float distance = (a - b).magnitude;
де
magnitude — довжина вектора, що потребує виклику Mathf.Sqrt(...).magnitude = Mathf.Sqrt(x*x + y*y + z*z);
І тут виникає підводний камінь — квадратний корінь це дорога операція для процесора. Хоча різниці практично нема. Просто як цікавий факт 💡
⚡️ Оптимальна альтернатива використання квадрату відстані:
public static float SqrDistance(Vector3 first, Vector3 second)
{
float deltaX = first.x - second.x;
float deltaY = first.y - second.y;
float deltaZ = first.z - second.z;
return deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;
}
🎯 Де це корисно?
Наприклад, коли потрібно перевірити, чи об’єкт знаходиться в межах певного радіусу — точне значення відстані не потрібне:
public static bool WithinRadius(Vector3 first, Vector3 second, float distance)
{
return SqrDistance(first, second) < distance * distance;
}
⚡️ Так ми уникаємо виклику
Mathf.Sqrt() і отримуємо кращу продуктивність, особливо якщо це викликається кожен кадр 💪💻 | GAMEDEV UA | #уроки #unitytips #vector #distance #squaredistance
👍9🔥4
1️⃣
[Header("Назва секції")]Додає заголовок у інспекторі над полем. Зручно групувати змінні.
[Header("Налаштування гравітації")]
public float gravity = 9.8f;2️⃣
[Tooltip("Підказка")]Показує опис при наведенні на поле.
[Tooltip("Швидкість руху персонажа")]
public float speed;3️⃣
[Space(Бажана кількість пікселів)]Додає вертикальний відступ між полями.
[Space(25)]
public int health;
4️⃣
[HideInInspector]Ховає public-змінну в інспекторі.
[HideInInspector]
public int secretValue;
5️⃣
[ContextMenu("Назва методу")]Дозволяє викликати метод з контекстного меню скрипта.
[ContextMenu("Reset Values")]
void ResetValues() {
health = 100;
speed = 5;
}6️⃣
[ContextMenuItem("Назва", "Метод")]При натисненні правою клавішою миші на поле, можна буде викликати метод.
[ContextMenuItem("Reset Speed", "ResetSpeedMethod")]
public float speed;
void ResetSpeed() {
speed = 5;
}7️⃣
[HelpURL("https://link.com")]При натисканні
URL.[HelpURL("https://docs.unity3d.com/Manual/class-Rigidbody.html")]
public class PlayerController : MonoBehaviour { }8️⃣
[RequireComponent(typeof(Rigidbody))]Автоматично додає потрібний компонент на об’єкт.
[RequireComponent(typeof(Rigidbody))]
public class PlayerController : MonoBehaviour { }
Як на мене,
[ContextMenu] найюзабельніший Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥18👍3🔥2✍1
🧠 Unity Dev Tip: що таке
Нещодавно стикнувся з ситуацією: у мене був список елементів і кожен новий елемент потрібно було називати автоматично у форматі
Робити це вручну — довго і лінь, особливо, якщо таких елементів багато. Робити це в
І тут згадую про одну класну річ —
🔍 То що таке
Для прикладу:
Тепер:
➜ Додаються нові елементи у списку
➜ Самоприсвоєння
➜ без натискання Play, без ручної роботи
⚠️ Важливе зауваження
Його задача підготувати дані ДО старту гри.
Це рішення не єдине можливе, але мені воно допомогло доволі швидко😅
✈️ Gamedev | #уроки #OnValidate #UnityTips #UnityEditor #ініціалізація #редактор
OnValidate() і навіщо воно взагалі потрібне?Нещодавно стикнувся з ситуацією: у мене був список елементів і кожен новий елемент потрібно було називати автоматично у форматі
mob_1, mob_2, mob_3 …Робити це вручну — довго і лінь, особливо, якщо таких елементів багато. Робити це в
Start() або Awake() запізно, бо значення потрібні ще до запуску гри.І тут згадую про одну класну річ —
OnValidate()🔍 То що таке
OnValidate()?OnValidate() — це editor-only метод у MonoBehaviour, який автоматично викликається в редакторі, коли скрипт завантажується або значення змінюється в Inspector. БЕЗ ЗАПУСКУ ГРИ!!!Для прикладу:
public class EnemyList : MonoBehaviour
{
// 📝 Список імен ворогів, які ми будемо автозаповнювати
[SerializeField] private List<string> enemyNames = new List<string>();
#if UNITY_EDITOR // ✅ Гарантуємо, що код не потрапить у билд гри
private void OnValidate()
{
// 🔄 Проходимось по всьому списку щоразу, коли змінюється щось у інспекторі
for (int i = 0; i < enemyNames.Count; i++)
{
// ❗️ Якщо елемент порожній або null — автоматично генеруємо ім'я
if (string.IsNullOrEmpty(enemyNames[i]))
enemyNames[i] = $"mob_{i + 1}"; // 👉 mob_1, mob_2, mob_3 ...
}
}
#endif
}
Тепер:
➜ Додаються нові елементи у списку
➜ Самоприсвоєння
mob_4, mob_5, mob_6…➜ без натискання Play, без ручної роботи
OnValidate() НЕ має працювати з runtime-логікою, збереженнями, фізикою тощо.Його задача підготувати дані ДО старту гри.
Це рішення не єдине можливе, але мені воно допомогло доволі швидко
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍4❤🔥3⚡2
🇯🇵 Прикол з перекладом
Нещодавно вперше мені довелося локалізувати гру на японську та китайські мови. І ось тут стався справжній прикол.
Усе виглядало чудово, але половина тексту перетворилася на квадратики.😅
Спочатку я подумав, що проблема в самих перекладених текстах або в ієрогліфах, можливо ChatGPT підкинув якісь рідкісні символи, або у шрифті від Google просто немає всіх потрібних знаків.
‼️ Перепробував кілька шрифтів, перевіряв кодування, навіть грішив на діалекти — нічого не допомагало.
І чисто випадково, мені прийшла в голову ідея просто збільшити атлас (дефолт при імпорті
Виявилося, що при маленькому атласі Unity просто не може “втиснути” всі гліфи у текстуру, і частину просто відкидає.
Тому якщо ви працюєте з японськими, китайськими чи корейськими символами:
🔸 Збільшіть розмір атласа хоча б до
🔸 Або зменште padding і font size в Font Asset Creator (з цим акуратно)
Інколи навіть такі дрібниці можуть “полагодити” цілу локалізацію😄
✈️ Gamedev | #уроки #lifehack #unity #localization #unitytips #TMP #fonts #локалізація
Нещодавно вперше мені довелося локалізувати гру на японську та китайські мови. І ось тут стався справжній прикол.
Усе виглядало чудово, але половина тексту перетворилася на квадратики.
Спочатку я подумав, що проблема в самих перекладених текстах або в ієрогліфах, можливо ChatGPT підкинув якісь рідкісні символи, або у шрифті від Google просто немає всіх потрібних знаків.
‼️ Перепробував кілька шрифтів, перевіряв кодування, навіть грішив на діалекти — нічого не допомагало.
І чисто випадково, мені прийшла в голову ідея просто збільшити атлас (дефолт при імпорті
1024х1024) на 2048х2048. І о чудо!Виявилося, що при маленькому атласі Unity просто не може “втиснути” всі гліфи у текстуру, і частину просто відкидає.
Тому якщо ви працюєте з японськими, китайськими чи корейськими символами:
🔸 Збільшіть розмір атласа хоча б до
2048 або 4096🔸 Або зменште padding і font size в Font Asset Creator (з цим акуратно)
Інколи навіть такі дрібниці можуть “полагодити” цілу локалізацію
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥18👍5🔥3❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥21👍6🔥2❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥8👍2🔥1