Devlog без QA | Розробка ігор
639 subscribers
221 photos
70 videos
427 links
Unity/Новини/Ідеї/Натхнення й інший якісний (а можливо і не дуже) контент тут!

Зв’язок: @DevAndrew

Анти-скам бот: @IndieSafeBot
Download Telegram
🔍Що таке Vector3.Distance і чому не завжди варто використовувати його?

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
🔥 8 атрибутів, які спрощують життя розробнику

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] найюзабельніший 😉

✈️ Gamedev | #уроки #Unity #атрибути #UnityTips #UnityAttributes
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥18👍3🔥21
🧠 Unity Dev Tip: що таке 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-логікою, збереженнями, фізикою тощо.
Його задача підготувати дані ДО старту гри.

Це рішення не єдине можливе, але мені воно допомогло доволі швидко 😅

✈️ Gamedev | #уроки #OnValidate #UnityTips #UnityEditor #ініціалізація #редактор
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍4❤‍🔥32
🇯🇵 Прикол з перекладом

Нещодавно вперше мені довелося локалізувати гру на японську та китайські мови. І ось тут стався справжній прикол.

Усе виглядало чудово, але половина тексту перетворилася на квадратики. 😅

Спочатку я подумав, що проблема в самих перекладених текстах або в ієрогліфах, можливо ChatGPT підкинув якісь рідкісні символи, або у шрифті від Google просто немає всіх потрібних знаків.

‼️ Перепробував кілька шрифтів, перевіряв кодування, навіть грішив на діалекти — нічого не допомагало.

І чисто випадково, мені прийшла в голову ідея просто збільшити атлас (дефолт при імпорті 1024х1024) на 2048х2048. І о чудо!

Виявилося, що при маленькому атласі Unity просто не може “втиснути” всі гліфи у текстуру, і частину просто відкидає.

Тому якщо ви працюєте з японськими, китайськими чи корейськими символами:

🔸 Збільшіть розмір атласа хоча б до 2048 або 4096

🔸 Або зменште padding і font size в Font Asset Creator (з цим акуратно)

Інколи навіть такі дрібниці можуть “полагодити” цілу локалізацію 😄

✈️ Gamedev | #уроки #lifehack #unity #localization #unitytips #TMP #fonts #локалізація
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥18👍5🔥32
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥21👍6🔥21
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥8👍2🔥1