Akrus Games | Unity
2.95K subscribers
408 photos
89 videos
11 files
351 links
Самые годные лайфхаки по unity c#

Сотрудничество/реклама/помощь @Akrus001
Download Telegram
АХАХАХ.

С этого дня буду писать годные посты каждый день. Так что подписывайтесь!
1👍8🔥4👎1😁1
⚡️ Двигаем камеру в 2D стратегии: перетаскивание + зум (с подробными комментариями)

Забудь про края экрана. Хочешь управлять камерой как в дорогих тактиках?
Зажимаешь правую кнопку — тащишь карту, крутишь колёсико — приближаешь/отдаляешь.

Код ниже — готовый компонент с подробными комментариями. Вешай на камеру и настраивай под себя.

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

💬 А ты камеру двигаешь или оставляешь статичной? Пиши в комментах.
17👍3🎄2🔥1
⚔️ 2D-стратегия: выделение юнитов рамкой за 5 минут

Делаешь 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
🔥82
Как делать UI, который не ломается

📌 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
6🔥3
⚡️ Патруль врага в 2D платформере

Когда враг ходит туда‑сюда между двумя точками — базовая механика любого платформера.

Сохраняй, пригодится в каждом втором проекте! 👇

Компоненты: 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)

Старый добрый способ, который все знают. Идеален для быстрого прототипа.

// Движение
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
🔥116
ИИ
Если бы не было чатагпт, не было таких цен на оперативную память, скорость работы программирования не возросла, не было бы этого канала.
Большинство из вас использует ИИ. Я в том числе.
Однако у ИИ есть проблема — он любит фантазировать, очень много фантазировать. Чтобы этого избежать, нужна правильная структура запроса.
Вот вам полезный промт, который убирает лишнюю "фантазию" ИИ:
Прежде чем дать мне ответ, оцени его
неопределённость. Если она больше, чем 0.1 — задавай
мне уточняющие вопросы до тех пор, пока
неопределённость будет 0.1 или меньше


Чтобы составить свой промт, надо:
1. Объяснить что ты делаешь
2. Что ты уже сделал
3. Объяснить, что должен сделать ИИ
4. Добавить примеры по возможности.

Используя эти 4 пункта и промт, можно достать максимум из ИИ
8🔥1
Присылайте свои работы в комментарии!👊
Лучшие выложу здесь!


Присылайте лучше видео. Хороший компрессор https://tools.rotato.app/compress, если не грузит используйте https://github.com/codeforreal1/compressO

Для новеньких поясняю: по сути это бесплатная реклама вашей игры и канала, только если у вас реально крутая игра)


#работыПодписчиков

🎧Akrus Games | Unity
5🔥2🎄1
This media is not supported in your browser
VIEW IN TELEGRAM
Игра подписчика @Lenya418
С января я делал Roguelike игру и сейчас могу поделиться прогрессом

Сейчас в игре:
•100+ скриптов
•10+ уникальных оружий
•20+ уникальных пуль для них
•15+ уникальных эффектов которые можно комбинировать между собой
•5+ бонусов
•Система генерации комнат
•Механика бомб
•Система волн с разными паттернами

Канал: https://t.me/StarGamesOne
Присылайте свои игры сюда
Akrus Games | Unity
👍131🎄1
Игра подписчика @pingalinux
Моя игра марбл судоку💎
Выпустила 2 недели назад и радуюсь
Уже более 3к скачиваний и несколько сотен активных игроков в день
В игре множество режимов, а также есть ачивки, лидерборд и ивенты🐈
Сейчас тружусь над уведомлениями

Канал: @LumaPlayUG
Игра: Плей маркет игры
Присылайте свои игры сюда
Akrus Games | Unity
🔥73👍2
Возможно, у кого-то есть старый аккаунт Google Play Разработчика (любого года).

Есть возможность хорошо заработать на этом.

Закрытые за неактив аккаунты тоже принимаются(помогу бесплатно восстановить)

По любым вопросам в ЛС @Ilya01s.
🔥5
Media is too big
VIEW IN TELEGRAM
Игра подписчика @blackdragon3129
Мой проект: Wall Walker - головоломка, где изменение гравитации стало ключевой механикой. В нём тебя ждёт:
⚙️ Множество разнообразных механик (помимо изменения гравитации)
🎨 Приятный глазу визуальный стиль
🗺 Куча уникальных уровней


Игра уже на финишной прямой, скоро релиз.

Канал: t.me/dragodev3129
Присылайте свои игры сюда
Akrus Games | Unity
🔥6
ART DOGS

Мы оформляем Steam-страницы для инди-проектов. Помогаем с капсулой, визуалом и упаковкой, чтобы игра выглядела профессионально с первого взгляда.


Что делаем:
— Полный комплект капсул для магазина и библиотеки Steam;
— Оформление фона страницы;
— Разработка логотипов;
— Геймплейные трейлеры;
— Короткие видео (Shorts, Reels, TikTok);
— Текстовое описание, гифки, скриншоты для страницы;
— Ачивки и трейд-карточки;
— Консультации по стилю, геймплею, позиционированию и оформлению;
— Тестирование проектов;
— Любое промо по договорённости;

Формат работы:
Можем выполнить задачи сдельно (по договору) или стать частью команды в формате внутренней студии.

📁 Канал с работами: https://t.me/ART_DOGS_STEAM_DESIGN

📁 Канал с отзывами: https://t.me/OTZIVARTDOGS
8👍2🔥2