⚡️ Unity: 5 вещей, которые убивают оптимизацию
Твой проект лагает даже на сцене с кубиками? Скорее всего, причина в одной из этих 5 ошибок. Устрани их — и производительность сразу вырастет.
1️⃣ Бесконечный поток новых объектов (Instantiate/Destroy)
Это хаос в памяти! Создание и удаление объекта — тяжёлые операции для Garbage Collector (GC).
📌 Что делать: Используй пул объектов (Object Pooling). Создай заранее 10 пуль, 20 врагов или 100 эффектов. Переиспользуй их, а не создавай заново.
💡 Создай один раз, спрячь (SetActive(false)), доставай когда нужно.
2️⃣ Полноценный Update() там, где можно обойтись
Проверка условия в Update() 60 раз в секунду — дикая нагрузка, если это не требуется.
📌 Что делать: Вместо
💡 Замени
3️⃣ Слишком много объектов на сцене с коллайдерами
Каждый коллайдер — нагрузка на физику (Physics Engine). 100 активных Rigidbody и BoxCollider = гарантированные тормоза.
📌 Что делать: Отключай (
💡 Ставь Static Flag для неподвижных объектов — физический движок их оптимизирует.
4️⃣ Сырые текстуры и модели
Загрузил в проект 4K текстуру для кнопки? Модель с 100к полигонов для камня? Память съедена, а FPS упал.
📌 Что делать: Всегда сжимай текстуры (Format: ASTC, ETC2). Оптимизируй полигоны моделей. Используй спрайт-атласы для 2D.
💡 В окне Import Settings задавай максимальный размер текстуры (Max Size 1024 для фона — уже много).
5️⃣ Глобальные переменные в скриптах
Постоянные обращения типа
📌 Что делать: Кэшируй ссылки! Выполни поиск в Start() или Awake() и сохрани в приватную переменную. Обращайся уже к ней.
💡 Вместо
🔥 Проверь свой проект по этим пунктам прямо сейчас. Чаще всего проблема в первых трёх!
📌 Сохрани этот чек-лист перед каждым билдом.
🔔 Подписывайся — дальше будет про оптимизацию UI, Shader'ов и памяти на мобилках.
💬 А с какой проблемой сталкивался ты? Пиши в комментах!
👉Akrus Games | Unity
Твой проект лагает даже на сцене с кубиками? Скорее всего, причина в одной из этих 5 ошибок. Устрани их — и производительность сразу вырастет.
1️⃣ Бесконечный поток новых объектов (Instantiate/Destroy)
Это хаос в памяти! Создание и удаление объекта — тяжёлые операции для Garbage Collector (GC).
📌 Что делать: Используй пул объектов (Object Pooling). Создай заранее 10 пуль, 20 врагов или 100 эффектов. Переиспользуй их, а не создавай заново.
💡 Создай один раз, спрячь (SetActive(false)), доставай когда нужно.
2️⃣ Полноценный Update() там, где можно обойтись
Проверка условия в Update() 60 раз в секунду — дикая нагрузка, если это не требуется.
📌 Что делать: Вместо
if (isReady) в Update() используй корутину с WaitForSeconds или InvokeRepeating. Для физики — FixedUpdate. Для событий — подписки (event/delegate).💡 Замени
void Update() на IEnumerator MyTimer() везде, где это возможно.3️⃣ Слишком много объектов на сцене с коллайдерами
Каждый коллайдер — нагрузка на физику (Physics Engine). 100 активных Rigidbody и BoxCollider = гарантированные тормоза.
📌 Что делать: Отключай (
enabled = false) коллайдеры у далёких или неактивных объектов. Для статичной декорации используй один Mesh Collider вместо сотни примитивных.💡 Ставь Static Flag для неподвижных объектов — физический движок их оптимизирует.
4️⃣ Сырые текстуры и модели
Загрузил в проект 4K текстуру для кнопки? Модель с 100к полигонов для камня? Память съедена, а FPS упал.
📌 Что делать: Всегда сжимай текстуры (Format: ASTC, ETC2). Оптимизируй полигоны моделей. Используй спрайт-атласы для 2D.
💡 В окне Import Settings задавай максимальный размер текстуры (Max Size 1024 для фона — уже много).
5️⃣ Глобальные переменные в скриптах
Постоянные обращения типа
FindObjectOfType<GameManager>() или GetComponent<>() в Update — это вызовы каждый кадр.📌 Что делать: Кэшируй ссылки! Выполни поиск в Start() или Awake() и сохрани в приватную переменную. Обращайся уже к ней.
💡 Вместо
GetComponent<Renderer>().material.color в цикле — сохрани Renderer _myRenderer один раз.🔥 Проверь свой проект по этим пунктам прямо сейчас. Чаще всего проблема в первых трёх!
📌 Сохрани этот чек-лист перед каждым билдом.
🔔 Подписывайся — дальше будет про оптимизацию UI, Shader'ов и памяти на мобилках.
💬 А с какой проблемой сталкивался ты? Пиши в комментах!
👉Akrus Games | Unity
❤7🔥4
✅ Tilemap в Unity: Создание 2D-уровней
Что это?
Система для быстрого построения 2D-уровней из тайлов (кирпичики-спрайты). Идеально для платформеров, топ-даун игр и пиксель-арта.
Как начать:
1. Создай Tilemap: ПКМ в Hierarchy → 2D Object → Tilemap
2. Добавь Grid (сетка-родитель для всех Tilemap), обычно создаётся автоматически
3. Открой окно Tile Palette (Window → 2D → Tile Palette)
Практика:
Основные инструменты:
• Кисть (Paint Brush) - рисование тайлов
• Заливка (Bucket) - заполнение областей
• Ластик (Erase) - удаление тайлов
• Rule Tiles - умные тайлы с авто-текстурированием
Создание Rule Tile:
1. ПКМ в Project → Create → 2D → Tiles → Rule Tile
2. Настрой правила соседства (например: трава с землёй снизу)
3. Перетащи в Tile Palette
Важные советы:
• Разделяй слои: Foreground, Background, Collision (добавь Composite Collider 2D)
• Используй Animated Tiles для воды/лавы
• Для оптимизации: включи Chunk Culling в Tilemap Renderer
• Экспортируй карты в .json через [SerializeField]
💡 Пример применения:
- Случайная генерация платформ
- Прорисовка подземелий
- Создание разрушаемых блоков
#Unity2D #Tilemap #GameDev #IndieDev
---
🔥 Дополнительные хаки:
1. Разрушаемые тайлы:
2. Авто-коллайдеры:
• Добавь Tilemap Collider 2D
• Выбери Used By Composite
• Добавь Composite Collider 2D (настрой форму в Rigidbody 2D)
3. Слои для сортировки:
• Настрой Sorting Layer в Tilemap Renderer
• Используй Order in Layer для переднего/заднего плана
Пост создан в вашем стиле: минимум теории, максимум практики! 🚀
Что это?
Система для быстрого построения 2D-уровней из тайлов (кирпичики-спрайты). Идеально для платформеров, топ-даун игр и пиксель-арта.
Как начать:
1. Создай Tilemap: ПКМ в Hierarchy → 2D Object → Tilemap
2. Добавь Grid (сетка-родитель для всех Tilemap), обычно создаётся автоматически
3. Открой окно Tile Palette (Window → 2D → Tile Palette)
Практика:
// Генерация случайного тайла в коде:
public Tile[] groundTiles; // Перетащи тайлы в инспектор
void GeneratePlatform()
{
Tilemap tilemap = GetComponent<Tilemap>();
Vector3Int position = new Vector3Int(Random.Range(-5, 5), 0, 0);
// Выбираем случайный тайл
Tile randomTile = groundTiles[Random.Range(0, groundTiles.Length)];
tilemap.SetTile(position, randomTile);
}
Основные инструменты:
• Кисть (Paint Brush) - рисование тайлов
• Заливка (Bucket) - заполнение областей
• Ластик (Erase) - удаление тайлов
• Rule Tiles - умные тайлы с авто-текстурированием
Создание Rule Tile:
1. ПКМ в Project → Create → 2D → Tiles → Rule Tile
2. Настрой правила соседства (например: трава с землёй снизу)
3. Перетащи в Tile Palette
Важные советы:
• Разделяй слои: Foreground, Background, Collision (добавь Composite Collider 2D)
• Используй Animated Tiles для воды/лавы
• Для оптимизации: включи Chunk Culling в Tilemap Renderer
• Экспортируй карты в .json через [SerializeField]
💡 Пример применения:
- Случайная генерация платформ
- Прорисовка подземелий
- Создание разрушаемых блоков
#Unity2D #Tilemap #GameDev #IndieDev
---
🔥 Дополнительные хаки:
1. Разрушаемые тайлы:
void DestroyTile(Vector2 worldPos)
{
Tilemap tilemap = GetComponent<Tilemap>();
Vector3Int cellPos = tilemap.WorldToCell(worldPos);
tilemap.SetTile(cellPos, null); // Удаляем тайл
SpawnExplosionEffect(worldPos);
}
2. Авто-коллайдеры:
• Добавь Tilemap Collider 2D
• Выбери Used By Composite
• Добавь Composite Collider 2D (настрой форму в Rigidbody 2D)
3. Слои для сортировки:
• Настрой Sorting Layer в Tilemap Renderer
• Используй Order in Layer для переднего/заднего плана
Пост создан в вашем стиле: минимум теории, максимум практики! 🚀
🔥5
Akrus Games | Unity
Video
⚡️ Подсветка объектов при наведении
Хочешь, чтобы игрок видел, на что можно кликнуть? Базовый, но важный приём.
Через Outline (красиво и профессионально)
Либо берём готовый ассет Quick Outline из Asset Store (бесплатный).
Ставим на объект скрипт, который включает/выключает компонент Outline при Raycast-попадании.
Скрипт OutCube для объекта:
Скрипт MouseOut для наведения мыши(необязательный, только для примера)
Что важно:
- Outline эффект работает поверх всего и не ломает текстуры.
- Можно настроить цвет (красный для врагов, зелёный для союзников).
- Не требует замены материала — значит, работает с любыми шейдерами.
Результат: игра сразу становится отзывчивее. Игрок понимает, с чем можно взаимодействовать, а UI не нужен.
💬 А ты как делаешь подсветку? Юзаешь ассеты или костылишь вручную?
🔔 Подпишись, дальше будет много про шейдеры, эффекты и оптимизацию в инди-разработке.
👉 Akrus Games | Unity
Хочешь, чтобы игрок видел, на что можно кликнуть? Базовый, но важный приём.
Через Outline (красиво и профессионально)
Либо берём готовый ассет Quick Outline из Asset Store (бесплатный).
Ставим на объект скрипт, который включает/выключает компонент Outline при Raycast-попадании.
Скрипт OutCube для объекта:
using UnityEngine;
// Этот класс отвечает за управление подсветкой (Outline) объекта
public class OutCube : MonoBehaviour
{
// Ссылка на компонент Outline, который создает подсветку вокруг объекта
public Outline _outline;
private void Start()
{
// Проверяем, есть ли у нас компонент Outline (не равен ли null)
if (_outline != null)
{
// Отключаем подсветку при старте игры, чтобы объект не светился сразу
_outline.enabled = false;
}
}
// Этот метод включает или выключает подсветку объекта
// state - параметр, который получает метод: true = включить, false = выключить
public void ToggleOutline(bool state)
{
if (_outline != null)
{
_outline.enabled = state;
}
}
}
Скрипт MouseOut для наведения мыши(необязательный, только для примера)
using UnityEngine;
public class MouseOut : MonoBehaviour
{
// Хранит информацию о последнем подсвеченном объекте
private OutCube _currentCube;
void Update()
{
// Создаем луч из камеры через позицию мыши на экране
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// Рисуем желтый луч в сцене для визуализации (видно только в режиме Scene)
Debug.DrawRay(ray.origin, ray.direction * 100f, Color.yellow);
// Physics.Raycast - пускаем луч и проверяем, во что он попал
if (Physics.Raycast(ray, out RaycastHit hit))
{
// Рисуем зеленый луч до точки попадания
Debug.DrawRay(ray.origin, ray.direction * hit.distance, Color.green);
// Пытаемся получить компонент OutCube с объекта, в который попал луч
OutCube cube = hit.collider.GetComponent<OutCube>();
// Проверяем: если на объекте есть компонент OutCube И это не тот же куб, на который мы уже смотрели
if (cube != null && cube != _currentCube)
{
// ?. - это безопасный вызов: если _currentCube не null, то вызываем метод
_currentCube?.ToggleOutline(false);
_currentCube = cube;
// Включаем подсветку у нового куба
_currentCube.ToggleOutline(true);
}
// Если луч попал в объект без компонента OutCube, но у нас был запомнен предыдущий куб
else if (cube == null && _currentCube != null)
{
// Выключаем подсветку у предыдущего куба
_currentCube.ToggleOutline(false);
// Забываем про предыдущий куб (теперь ни на что не наведены)
_currentCube = null;
}
}
// Если луч вообще ни во что не попал, но у нас был запомнен подсвеченный куб
else if (_currentCube != null)
{
// Выключаем подсветку у последнего куба
_currentCube.ToggleOutline(false);
// Забываем про него
_currentCube = null;
}
}
}
Что важно:
- Outline эффект работает поверх всего и не ломает текстуры.
- Можно настроить цвет (красный для врагов, зелёный для союзников).
- Не требует замены материала — значит, работает с любыми шейдерами.
Результат: игра сразу становится отзывчивее. Игрок понимает, с чем можно взаимодействовать, а UI не нужен.
💬 А ты как делаешь подсветку? Юзаешь ассеты или костылишь вручную?
🔔 Подпишись, дальше будет много про шейдеры, эффекты и оптимизацию в инди-разработке.
👉 Akrus Games | Unity
❤6👍2🔥2
⚡️ Двигаем камеру в 2D стратегии: перетаскивание + зум (с подробными комментариями)
Забудь про края экрана. Хочешь управлять камерой как в дорогих тактиках?
Зажимаешь правую кнопку — тащишь карту, крутишь колёсико — приближаешь/отдаляешь.
Код ниже — готовый компонент с подробными комментариями. Вешай на камеру и настраивай под себя.
✅ Что важно знать
- Ортографическая камера — используй для 2D, тайлов, стратегий. В инспекторе поставь
- Скорости (
- Ограничения:
📌 Сохрани пост — пригодится в любом проекте с картой.
🔔 Подпишись — дальше будет про инерцию, ограничение краёв карты и сглаживание движения.
👉 Akrus Games | Unity
💬 А ты камеру двигаешь или оставляешь статичной? Пиши в комментах.
Забудь про края экрана. Хочешь управлять камерой как в дорогих тактиках?
Зажимаешь правую кнопку — тащишь карту, крутишь колёсико — приближаешь/отдаляешь.
Код ниже — готовый компонент с подробными комментариями. Вешай на камеру и настраивай под себя.
using UnityEngine;
public class CameraDragZoom : MonoBehaviour
{
[Header("Перетаскивание")]
[Tooltip("Скорость движения камеры за мышкой")]
[SerializeField] private float dragSpeed = 1f;
private Vector3 dragOrigin; // точка в мире, где была мышь в момент начала перетаскивания
[Header("Зум")]
[Tooltip("Чувствительность колёсика мыши")]
[SerializeField] private float zoomSpeed = 5f;
[Tooltip("Минимальный размер камеры (сильное приближение)")]
[SerializeField] private float minSize = 3f;
[Tooltip("Максимальный размер камеры (сильное отдаление)")]
[SerializeField] private float maxSize = 10f;
private Camera cam;
private void Start()
{
// Получаем компонент камеры на этом же объекте
cam = GetComponent<Camera>();
// Если камера не ортографическая (например, 3D), можно переключить режим в инспекторе
// Для 2D стратегии камера обычно ортографическая
}
private void Update()
{
// --- Перетаскивание (правая кнопка мыши) ---
// При зажатии ПКМ запоминаем позицию мыши в мировых координатах
if (Input.GetMouseButtonDown(1))
{
// ScreenToWorldPoint переводит экранные пиксели в координаты мира
dragOrigin = cam.ScreenToWorldPoint(Input.mousePosition);
}
// Пока кнопка зажата — двигаем камеру
if (Input.GetMouseButton(1))
{
// Разница между запомненной точкой и текущим положением мыши в мире
Vector3 difference = dragOrigin - cam.ScreenToWorldPoint(Input.mousePosition);
// Перемещаем камеру на эту разницу (игнорируем Z, т.к. камера смотрит сверху)
transform.position += difference;
}
// --- Зум колёсиком мыши ---
// Input.GetAxis("Mouse ScrollWheel") даёт значение:
// > 0 если крутим вверх (приближение)
// < 0 если крутим вниз (отдаление)
float scroll = Input.GetAxis("Mouse ScrollWheel");
if (scroll != 0f)
{
// Для 2D камеры меняем orthographicSize
cam.orthographicSize -= scroll * zoomSpeed;
// Ограничиваем размер, чтобы камера не улетела слишком близко или далеко
cam.orthographicSize = Mathf.Clamp(cam.orthographicSize, minSize, maxSize);
}
}
}
✅ Что важно знать
- Ортографическая камера — используй для 2D, тайлов, стратегий. В инспекторе поставь
Projection: Orthographic. - Скорости (
dragSpeed, zoomSpeed) сейчас используются по-разному: для перетаскивания скорость жёстко не регулируется (движение 1:1). Если хочешь замедлить перетаскивание — умножай difference на dragSpeed * Time.deltaTime. Но обычно 1:1 удобнее. - Ограничения:
minSize и maxSize подбирай под размер своей карты. Чтобы камера не выходила за края, можно добавить проверку границ (это уже другая тема).📌 Сохрани пост — пригодится в любом проекте с картой.
🔔 Подпишись — дальше будет про инерцию, ограничение краёв карты и сглаживание движения.
👉 Akrus Games | Unity
💬 А ты камеру двигаешь или оставляешь статичной? Пиши в комментах.
1❤7👍3🎄2🔥1
⚔️ 2D-стратегия: выделение юнитов рамкой за 5 минут
Делаешь RTS или тактику в 2D? Показываю, как реализовать выделение нескольких юнитов рамкой. Весь код ниже — бери и пользуйся.
Суть: зажимаешь ЛКМ, тащишь — рисуется прямоугольник. Отпускаешь — все юниты внутри становятся выбранными.
Что понадобится:
- У всех юнитов должен быть Collider2D (Box, Circle — любой).
- Юниты лежат на слое
- На сцене есть камера с тегом MainCamera.
Код менеджера выделения (вешаем на пустой объект):
Компонент Unit (вешаем на каждого юнита):
Лайфхак:
- Не забудь в инспекторе у
- Чтобы рамка рисовалась красиво, используй не
-
✅ Готово. Теперь зажимай мышку и выделяй армию!
Хочешь такое же передвижение камеры с помощью курсора? Тогда читай этот пост!
🔔 Подпишись, чтобы видеть новые гайды!
👉 Akrus Games | Unity
Делаешь RTS или тактику в 2D? Показываю, как реализовать выделение нескольких юнитов рамкой. Весь код ниже — бери и пользуйся.
Суть: зажимаешь ЛКМ, тащишь — рисуется прямоугольник. Отпускаешь — все юниты внутри становятся выбранными.
Что понадобится:
- У всех юнитов должен быть Collider2D (Box, Circle — любой).
- Юниты лежат на слое
Units (так проще фильтровать).- На сцене есть камера с тегом MainCamera.
Код менеджера выделения (вешаем на пустой объект):
using UnityEngine;
public class SelectionManager : MonoBehaviour
{
[SerializeField] private LayerMask unitLayerMask; // Слой юнитов в инспекторе
private Vector2 startMousePos;
private bool isDragging = false;
private Rect selectionRect;
void Update()
{
// Начало выделения
if (Input.GetMouseButtonDown(0))
{
startMousePos = Input.mousePosition;
isDragging = true;
}
// Завершение выделения
if (Input.GetMouseButtonUp(0) && isDragging)
{
isDragging = false;
SelectUnitsInRect();
}
// Обновление рамки (для отрисовки)
if (isDragging)
{
UpdateSelectionRect();
}
}
void UpdateSelectionRect()
{
Vector2 currentMousePos = Input.mousePosition;
selectionRect = new Rect(
Mathf.Min(startMousePos.x, currentMousePos.x),
Mathf.Min(startMousePos.y, currentMousePos.y),
Mathf.Abs(startMousePos.x - currentMousePos.x),
Mathf.Abs(startMousePos.y - currentMousePos.y)
);
}
void SelectUnitsInRect()
{
// Конвертируем экранные координаты в мировые
Vector2 min = Camera.main.ScreenToWorldPoint(selectionRect.min);
Vector2 max = Camera.main.ScreenToWorldPoint(selectionRect.max);
// Ищем все коллайдеры внутри прямоугольника
Collider2D[] hits = Physics2D.OverlapAreaAll(min, max, unitLayerMask);
// Сначала снимаем выделение со всех
DeselectAllUnits();
// Выделяем найденных
foreach (var hit in hits)
{
if (hit.TryGetComponent<Unit>(out var unit))
{
unit.SetSelected(true);
}
}
}
void DeselectAllUnits()
{
// Можно найти всех юнитов по тегу или держать список
// Для простоты — ищем все объекты с компонентом Unit
Unit[] allUnits = FindObjectsOfType<Unit>();
foreach (var unit in allUnits)
{
unit.SetSelected(false);
}
}
// Визуализация рамки в редакторе (для отладки)
void OnGUI()
{
if (isDragging)
{
// Конвертируем экранный rect в GUI-координаты
Rect guiRect = new Rect(
selectionRect.x,
Screen.height - selectionRect.y - selectionRect.height,
selectionRect.width,
selectionRect.height
);
GUI.Box(guiRect, "");
}
}
}
Компонент Unit (вешаем на каждого юнита):
using UnityEngine;
public class Unit : MonoBehaviour
{
[SerializeField] private GameObject selectionVisual; // например, спрайт кружка под юнитом
public void SetSelected(bool selected)
{
if (selectionVisual != null)
selectionVisual.SetActive(selected);
}
}
Лайфхак:
- Не забудь в инспекторе у
SelectionManager выставить слой Units в поле unitLayerMask.- Чтобы рамка рисовалась красиво, используй не
GUI.Box, а натяни на Canvas обычный Image и двигай его размеры. Но для старта хватит и этого.-
FindObjectsOfType в DeselectAllUnits — не самый производительный вариант. Для продакшена лучше держать список всех юнитов в менеджере и обновлять его при спавне/смерти.✅ Готово. Теперь зажимай мышку и выделяй армию!
Хочешь такое же передвижение камеры с помощью курсора? Тогда читай этот пост!
🔔 Подпишись, чтобы видеть новые гайды!
👉 Akrus Games | Unity
🔥8❤2
Какая у вас скорость интернета?
Anonymous Poll
9%
0 Мбит/с
18%
1-50 Мбит/с
30%
51-100 Мбит/с
14%
101-200 Мбит/с
12%
200-500 Мбит/с
17%
>500 Мбит/с
🔥4
Как делать UI, который не ломается
📌 Middle-уровень — это не просто «UI работает». Это UI, который масштабируется, адаптируется и не разваливается на любом экране.
1️⃣ Canvas Scaler: Scale With Screen Size
📌 UI масштабируется пропорционально экрану. Не забудь установить Screen Match Mode в Match Width Or Height.
2️⃣ Layout Group + ContentSizeFitter — друг, но с оглядкой
📌 Уходи от фиксированных размеров. Пусть элементы растягиваются и подстраиваются.
НО: ContentSizeFitter тяжёлый в Scroll View. На списках — лучше вручную контролировать размеры через LayoutElement.
3️⃣ Safe Area — must have на мобилках
📌 Используй Screen.safeArea и адаптируй UI под вырезы, чёлки, панели.
Особенно важно для iPhone X+, Samsung с закруглёнными краями.
Есть готовые плагины (например, SafeArea.cs) — или пиши свой, обрезая RectTransform под safeArea.
4️⃣ Anchors и Pivot — основа адаптивного UI
📌 Никогда не ставь UI в абсолютные координаты.
Используй anchorMin и anchorMax — например, чтобы кнопка «назад» всегда оставалась в левом верхнем углу, независимо от разрешения.
5️⃣ UI Manager — централизованное управление интерфейсом
📌 Используй один UIManager, который управляет:
• текущими экранами (через стэк или FSM)
• открытием/закрытием окон
• блокировкой ввода
• переходами (анимации, звук, пауза)
💡 Идеально: событийная архитектура. Панель не знает о других панелях — всё через UIManager.Show("Settings").
🎯 Почему это важно?
UI — это первое, что видит игрок. Даже простая игра выглядит “профессионально”, если у неё стабильный и адаптивный интерфейс.
💬 Что у тебя чаще всего ломается в UI?
🔔 Подписывайся — впереди посты про оптимизацию, UI-архитектуру и best practices
👉Akrus Games | Unity
📌 Middle-уровень — это не просто «UI работает». Это UI, который масштабируется, адаптируется и не разваливается на любом экране.
1️⃣ Canvas Scaler: Scale With Screen Size
UI Scale Mode: Scale With Screen Size
Reference Resolution: 1920 x 1080 (или 1080 x 1920 для вертикали)📌 UI масштабируется пропорционально экрану. Не забудь установить Screen Match Mode в Match Width Or Height.
2️⃣ Layout Group + ContentSizeFitter — друг, но с оглядкой
📌 Уходи от фиксированных размеров. Пусть элементы растягиваются и подстраиваются.
НО: ContentSizeFitter тяжёлый в Scroll View. На списках — лучше вручную контролировать размеры через LayoutElement.
3️⃣ Safe Area — must have на мобилках
📌 Используй Screen.safeArea и адаптируй UI под вырезы, чёлки, панели.
Особенно важно для iPhone X+, Samsung с закруглёнными краями.
Есть готовые плагины (например, SafeArea.cs) — или пиши свой, обрезая RectTransform под safeArea.
4️⃣ Anchors и Pivot — основа адаптивного UI
📌 Никогда не ставь UI в абсолютные координаты.
Используй anchorMin и anchorMax — например, чтобы кнопка «назад» всегда оставалась в левом верхнем углу, независимо от разрешения.
5️⃣ UI Manager — централизованное управление интерфейсом
📌 Используй один UIManager, который управляет:
• текущими экранами (через стэк или FSM)
• открытием/закрытием окон
• блокировкой ввода
• переходами (анимации, звук, пауза)
💡 Идеально: событийная архитектура. Панель не знает о других панелях — всё через UIManager.Show("Settings").
🎯 Почему это важно?
UI — это первое, что видит игрок. Даже простая игра выглядит “профессионально”, если у неё стабильный и адаптивный интерфейс.
💬 Что у тебя чаще всего ломается в UI?
🔔 Подписывайся — впереди посты про оптимизацию, UI-архитектуру и best practices
👉Akrus Games | Unity
❤11👍2🔥1🎄1
Мы объединились и создали лучшую папку каналов по геймдеву "The Gamedev"!
Это место, где собраны самые полезные, активные и вдохновляющие каналы индустрии, где каждый разработчик найдёт для себя что-то действительно ценное:
Подключайтесь к папке The GameDev и станьте частью сильного комьюнити!
👉https://t.me/addlist/Ca1yrpya6iwxYzky
Это место, где собраны самые полезные, активные и вдохновляющие каналы индустрии, где каждый разработчик найдёт для себя что-то действительно ценное:
🧑💻 Помощь и практические советы по разработке игр
🆓 Бесплатные раздачи ассетов и промокоды
📣 Актуальные новости геймдева
📱 Советы по заработку на разных игровых площадках
📱 Авторские каналы по геймдизайну
📸 Личные блоги разработчиков
Подключайтесь к папке The GameDev и станьте частью сильного комьюнити!
👉https://t.me/addlist/Ca1yrpya6iwxYzky
❤6🔥3
⚡️ Патруль врага в 2D платформере
Когда враг ходит туда‑сюда между двумя точками — базовая механика любого платформера.
Сохраняй, пригодится в каждом втором проекте! 👇
Компоненты:
✅ Плюсы: враг не пройдёт сквозь стены, реагирует на физику.
❌ Минусы: нужно следить за застреванием (можно добавить Raycast для проверки края).
📌 Сохрани пост, чтобы не потерять коды.
🔔 Подпишись – дальше будет ещё больше готовых решений для 2D и не только.
👉 Akrus Games | Unity
Когда враг ходит туда‑сюда между двумя точками — базовая механика любого платформера.
Сохраняй, пригодится в каждом втором проекте! 👇
Компоненты:
PointA, PointB(границы патрулирования) + Rigidbody2D (кинематик или динамик – по желанию).using UnityEngine;
public class Patrol : MonoBehaviour
{
[SerializeField] private Transform pointA;
[SerializeField] private Transform pointB;
[SerializeField] private float speed = 3f;
private Rigidbody2D rb;
private Transform targetPoint;
void Start()
{
rb = GetComponent<Rigidbody2D>();
targetPoint = pointA;
}
void FixedUpdate()
{
// направление к цели
Vector2 direction = (targetPoint.position - transform.position).normalized;
// двигаем через velocity (сохраняем гравитацию по Y)
rb.velocity = new Vector2(direction.x * speed, rb.velocity.y);
// если почти дошли по X – меняем цель
if (Mathf.Abs(targetPoint.position.x - transform.position.x) < 0.1f)
{
targetPoint = targetPoint == pointA ? pointB : pointA;
// разворачиваем спрайт (опционально)
Flip();
}
}
private void Flip()
{
Vector3 scale = transform.localScale;
scale.x *= -1;
transform.localScale = scale;
}
}
✅ Плюсы: враг не пройдёт сквозь стены, реагирует на физику.
❌ Минусы: нужно следить за застреванием (можно добавить Raycast для проверки края).
📌 Сохрани пост, чтобы не потерять коды.
🔔 Подпишись – дальше будет ещё больше готовых решений для 2D и не только.
👉 Akrus Games | Unity
❤7🔥3👎1😁1
⚡️ Unity: шпаргалка по Input
Сохрани, чтобы управление в твоей игре всегда работало чётко! Два основных подхода — старый и новый.
1️⃣ Классический Input Manager (Input.GetKey)
Старый добрый способ, который все знают. Идеален для быстрого прототипа.
✅ Быстро и понятно
❌ Жёстко зашито в коде, сложно переключать схемы управления
2️⃣ Новая система Input System (Unity Package)
Мощный и гибкий инструмент. Нужно поставить через Package Manager.
📌 Сначала настрой Input Actions:
• Создай Action Map (например, "Player")
• Добавь Actions ("Move", "Jump", "Fire")
• Назначь кнопки (WASD, Space, Mouse)
✅ Переключаемые схемы управления (геймпад, клавиатура)
✅ Автоматическая ремаппинг кнопок
❌ Нужно время на настройку
🔥 Важно:
• Для нового Input System не забудь
• В Build Settings → Player → Active Input Handling выбери "Both"
💬 Какую систему используешь ты? Классику или новую?
🔔 Подпишись — впереди ещё много шпаргалок по Unity и C#!
👉Akrus Games | Unity
Сохрани, чтобы управление в твоей игре всегда работало чётко! Два основных подхода — старый и новый.
1️⃣ Классический Input Manager (Input.GetKey)
Старый добрый способ, который все знают. Идеален для быстрого прототипа.
// Движение
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
// Прыжок
if (Input.GetKeyDown(KeyCode.Space))
{
Jump();
}
// ЛКМ
if (Input.GetMouseButtonDown(0))
{
Shoot();
}
✅ Быстро и понятно
❌ Жёстко зашито в коде, сложно переключать схемы управления
2️⃣ Новая система Input System (Unity Package)
Мощный и гибкий инструмент. Нужно поставить через Package Manager.
📌 Сначала настрой Input Actions:
• Создай Action Map (например, "Player")
• Добавь Actions ("Move", "Jump", "Fire")
• Назначь кнопки (WASD, Space, Mouse)
using UnityEngine.InputSystem;
// Чтение вектора движения
private void OnMove(InputValue value)
{
Vector2 moveInput = value.Get<Vector2>();
// перемещаем объект
}
// Обработка одиночного нажатия
private void OnJump(InputValue value)
{
if (value.isPressed) Jump();
}
✅ Переключаемые схемы управления (геймпад, клавиатура)
✅ Автоматическая ремаппинг кнопок
❌ Нужно время на настройку
🔥 Важно:
• Для нового Input System не забудь
PlayerInput компонент на объект• В Build Settings → Player → Active Input Handling выбери "Both"
💬 Какую систему используешь ты? Классику или новую?
🔔 Подпишись — впереди ещё много шпаргалок по Unity и C#!
👉Akrus Games | Unity
🔥11❤6
ИИ
Если бы не было чатагпт, не было таких цен на оперативную память, скорость работы программирования не возросла, не было бы этого канала.
Большинство из вас использует ИИ. Я в том числе.
Однако у ИИ есть проблема — он любит фантазировать, очень много фантазировать. Чтобы этого избежать, нужна правильная структура запроса.
Вот вам полезный промт, который убирает лишнюю "фантазию" ИИ:
Чтобы составить свой промт, надо:
Используя эти 4 пункта и промт, можно достать максимум из ИИ
Если бы не было чатагпт, не было таких цен на оперативную память, скорость работы программирования не возросла, не было бы этого канала.
Большинство из вас использует ИИ. Я в том числе.
Однако у ИИ есть проблема — он любит фантазировать, очень много фантазировать. Чтобы этого избежать, нужна правильная структура запроса.
Вот вам полезный промт, который убирает лишнюю "фантазию" ИИ:
Прежде чем дать мне ответ, оцени его
неопределённость. Если она больше, чем 0.1 — задавай
мне уточняющие вопросы до тех пор, пока
неопределённость будет 0.1 или меньше
Чтобы составить свой промт, надо:
1. Объяснить что ты делаешь
2. Что ты уже сделал
3. Объяснить, что должен сделать ИИ
4. Добавить примеры по возможности.
Используя эти 4 пункта и промт, можно достать максимум из ИИ
❤8🔥1
Какой ии в используете?
Anonymous Poll
43%
чат гпт
37%
дипсик
19%
claude
9%
codex
29%
gemeni
4%
яндексгпт
12%
что-то еще(напишите в комментариях)
6%
не использую
🔥8
Присылайте свои работы в комментарии!👊
Лучшие выложу здесь!
Присылайте лучше видео. Хороший компрессор https://tools.rotato.app/compress , если не грузит используйте https://github.com/codeforreal1/compressO
Для новеньких поясняю: по сути это бесплатная реклама вашей игры и канала, только если у вас реально крутая игра)
#работыПодписчиков
🎧Akrus Games | Unity
Лучшие выложу здесь!
Для новеньких поясняю: по сути это бесплатная реклама вашей игры и канала, только если у вас реально крутая игра)
#работыПодписчиков
🎧Akrus Games | Unity
❤5🔥2🎄1