⚔️ Unity: как сделать, чтобы игра не казалась казуальной?
Хочешь, чтобы твою инди-игру воспринимали всерьёз, а не как лёгкий таймкиллер? Вот ключевые точки, где нужно сместить акценты.
1️⃣ Сложность: дай игроку пространство для ошибки, но сделай её дорогой
• Не добавляй «бесконечные жизни». Лучше одна сложная, но честная проверка навыков.
• Откажись от автопомощи в геймплее: никаких автоприцелов или подсказок "нажми сюда" без крайней нужды.
• Введи перманентные последствия: потеря ресурса, изменение мира, перманентная смерть (permadeath) для хардкорного ощущения.
2️⃣ Визуал и атмосфера: серьёзный тон вместо «милоты»
• Цветовая палитра: избегай слишком ярких, "мультяшных" цветов. Используй приглушённые, контрастные тона.
• Звук и музыка: атмосферный саундтрек, а не весёлые мелодии. Звуки должны быть "тяжёлыми" — шаги, удары, скрипы.
• Шейдеры и постобработка: добавь эффекты зерна (Film Grain), хроматических аберраций, виньетирования. Это создаёт "кинематографичную" и взрослую картинку.
3️⃣ Глубина механик: игрок должен думать, а не просто тапать
• Нелинейность: несколько путей прохождения, скрытые зоны, секреты, которые не подсвечены.
• Система крафта/прокачки с выбором: не "улучши всё", а "выбери ветку, откажись от другого". Это создаёт осмысленность.
• Динамические системы: NPC, которые живут своей жизнью, погода, влияющая на геймплей, последствия выбора.
4️⃣ Подача и интерфейс (UI/UX): минимализм и отсутствие "руки-водилки"
• Чистый, сдержанный интерфейс. Никаких пузырьков, мигающих стрелок или детских шрифтов.
• Обучение через практику. Не текстовые стены туториала, а интеграция обучения в геймплей (как в Dark Souls).
• Скрытая статистика и механики. Пусть игрок сам экспериментирует и открывает взаимодействия.
💡 Главный принцип: УВАЖАЙ игрока. Дай ему вызов, доверь его интеллекту, погрузи в атмосферу. Игра перестаёт быть казуальной, когда к ней нужно относиться серьёзно.
🔔 Подписывайся, чтобы не пропустить разборы конкретных техник: от сложного AI до создания мрачной атмосферы в URP.
💬 А что, по-твоему, убивает "казуальность" в игре? Делитесь в комментариях! 👉 Akrus Games | Unity
Хочешь, чтобы твою инди-игру воспринимали всерьёз, а не как лёгкий таймкиллер? Вот ключевые точки, где нужно сместить акценты.
1️⃣ Сложность: дай игроку пространство для ошибки, но сделай её дорогой
• Не добавляй «бесконечные жизни». Лучше одна сложная, но честная проверка навыков.
• Откажись от автопомощи в геймплее: никаких автоприцелов или подсказок "нажми сюда" без крайней нужды.
• Введи перманентные последствия: потеря ресурса, изменение мира, перманентная смерть (permadeath) для хардкорного ощущения.
2️⃣ Визуал и атмосфера: серьёзный тон вместо «милоты»
• Цветовая палитра: избегай слишком ярких, "мультяшных" цветов. Используй приглушённые, контрастные тона.
• Звук и музыка: атмосферный саундтрек, а не весёлые мелодии. Звуки должны быть "тяжёлыми" — шаги, удары, скрипы.
• Шейдеры и постобработка: добавь эффекты зерна (Film Grain), хроматических аберраций, виньетирования. Это создаёт "кинематографичную" и взрослую картинку.
3️⃣ Глубина механик: игрок должен думать, а не просто тапать
• Нелинейность: несколько путей прохождения, скрытые зоны, секреты, которые не подсвечены.
• Система крафта/прокачки с выбором: не "улучши всё", а "выбери ветку, откажись от другого". Это создаёт осмысленность.
• Динамические системы: NPC, которые живут своей жизнью, погода, влияющая на геймплей, последствия выбора.
4️⃣ Подача и интерфейс (UI/UX): минимализм и отсутствие "руки-водилки"
• Чистый, сдержанный интерфейс. Никаких пузырьков, мигающих стрелок или детских шрифтов.
• Обучение через практику. Не текстовые стены туториала, а интеграция обучения в геймплей (как в Dark Souls).
• Скрытая статистика и механики. Пусть игрок сам экспериментирует и открывает взаимодействия.
💡 Главный принцип: УВАЖАЙ игрока. Дай ему вызов, доверь его интеллекту, погрузи в атмосферу. Игра перестаёт быть казуальной, когда к ней нужно относиться серьёзно.
🔔 Подписывайся, чтобы не пропустить разборы конкретных техник: от сложного AI до создания мрачной атмосферы в URP.
💬 А что, по-твоему, убивает "казуальность" в игре? Делитесь в комментариях! 👉 Akrus Games | Unity
🔥9👍4 3
⚙️ Unity: рабочий способ сделать колесо фортуны
Сохрани этот рецепт, когда понадобится рулетка, лутбокс или мини-игра с вращением. Сделаем быстро и без боли.
Идея: вращаем объект через
1️⃣ Скрипт контролируемого вращения:
2️⃣ Как использовать:
• Укажи в
• Вызови метод
🔔 Подпишись — впереди еще больше готовых решений для твоего инди-проекта.
👉Akrus Games | Unity
Сохрани этот рецепт, когда понадобится рулетка, лутбокс или мини-игра с вращением. Сделаем быстро и без боли.
Идея: вращаем объект через
Transform.Rotate по заданному алгоритму — колесо сделает N полных оборотов + смещение до выигрышного сектора.1️⃣ Скрипт контролируемого вращения:
public class ControlledWheel : MonoBehaviour
{
public int totalSectors = 8;
public float spinDuration = 5f;
public int winSectorIndex = 0; // Индекс выигрышного сектора (считай с 0)
public void Spin()
{
float fullCircles = 3; // Количество полных оборотов перед остановкой
float sectorAngle = 360f / totalSectors;
float targetAngle = 360f * fullCircles + (sectorAngle * winSectorIndex);
StartCoroutine(SpinRoutine(targetAngle));
}
IEnumerator SpinRoutine(float targetAngle)
{
float elapsed = 0;
float startAngle = transform.eulerAngles.z;
while (elapsed < spinDuration)
{
float t = elapsed / spinDuration;
t = t * t * (3f - 2f * t); // SmoothStep для плавного замедления
float angle = Mathf.Lerp(startAngle, startAngle + targetAngle, t);
transform.rotation = Quaternion.Euler(0, 0, angle);
elapsed += Time.deltaTime;
yield return null;
}
// Точная остановка на выигрышном секторе
transform.rotation = Quaternion.Euler(0, 0, startAngle + targetAngle);
Debug.Log($"Выпал сектор: {winSectorIndex + 1}");
}
}
2️⃣ Как использовать:
• Укажи в
winSectorIndex номер выигрышного сектора (от 0).• Вызови метод
Spin() по нажатию кнопки.🔔 Подпишись — впереди еще больше готовых решений для твоего инди-проекта.
👉Akrus Games | Unity
❤5👍5👎2🔥1 1
🎨 Unity: палитра для каждого жанра
Выбираешь цвета «на глаз»? Они задают тон всей игре. Подбери палитру под жанр — и игрок с первых секунд поймёт, во что он попал.
Сохраняй шпаргалку для своих проектов!
🔶 Ретро-платформер / Пиксель-арт
▪️ Цвета: Яркие, контрастные. Чистые оттенки без градиентов.
▪️ Пример: Тёмный фон (#0D2B4D), яркий герой (#FF963D), кислотные враги (#FF004D).
▪️ Зачем: Чёткое разделение объектов на экране. Дух старых консолей.
▪️ Ресурс: https://lospec.com/palettes — сотни готовых палитр.
🌌 Космический хоррор / Sci-Fi
▪️ Цвета: Холодные, приглушённые. Синие, зелёные, серые тона. Яркие акценты только на интерфейсе.
▪️ Пример: Основной — #1C2E45, металл — #7A93A5, свет панелей — #00FFE0.
▪️ Зачем: Давление, одиночество, холод техники. Красный сигнал тревоги будет врезаться в память.
▪️ Лайфхак: В постобработке (Color Grading) сдвинь баланс белого в синий.
☀️ Казуальная 3D-аркада / Гонки
▪️ Цвета: Тёплые, «летние». Нежно-голубой небо (#87CEEB), зелёная трава (#7CFC00), яркие элементы геймплея (красный, оранжевый).
▪️ Пример: Фон — пастельный, игровые объекты — насыщенные.
▪️ Зачем: Чувство лёгкости, позитива. Игрок не напрягается.
▪️ Правило: Небо и земля — светлые и ненасыщенные. Герой/машина — самый яркий пятно.
🧟 Выживание / Пост-апокалипсис
▪️ Цвета: Землистые, грязные. Коричневый (#4A3728), тускло-зелёный (#5A7D5A), грязно-жёлтый (#B5A642).
▪️ Пример: Нет чистых красок. Всё будто в пыли.
▪️ Зачем: Передать атмосферу упадка, истощения ресурсов.
▪️ Фишка: Добавь поверх всего лёгкий оверлей (Color Grading) с оттенком сепии или серого.
⚡️ Ключевой принцип: 60-30-10
• 60% экрана — доминирующий цвет (фон, земля).
• 30% — вторичный цвет (объекты, здания).
• 10% — акцентный цвет (герой, враги, кнопки, коллекционные предметы).
Именно эти 10% цвета игрок запомнит. Сделай их контрастными!
💭 Как внедрить?
1. Закрепи в сцене простой материал с нужной палитрой.
2. Настрой освещение (Temperature в лайтах) под цветовую гамму.
3. Используй Pixelator или Palette Editor из Asset Store для быстрого подбора.
✅ Вывод: Цвет — это невидимый геймдизайнер. Он направляет взгляд и создаёт настроение.
📌 Сохрани эту схему перед началом следующего проекта!
🔔 Подпишись — завтра покажу, как через Shader Graph за 5 минут сделать стилизацию под любой жанр.
💬 В каком жанре делаешь игру? Как подбираешь цвета? Пиши в комментах!
👉Akrus Games | Unity
Выбираешь цвета «на глаз»? Они задают тон всей игре. Подбери палитру под жанр — и игрок с первых секунд поймёт, во что он попал.
Сохраняй шпаргалку для своих проектов!
🔶 Ретро-платформер / Пиксель-арт
▪️ Цвета: Яркие, контрастные. Чистые оттенки без градиентов.
▪️ Пример: Тёмный фон (#0D2B4D), яркий герой (#FF963D), кислотные враги (#FF004D).
▪️ Зачем: Чёткое разделение объектов на экране. Дух старых консолей.
▪️ Ресурс: https://lospec.com/palettes — сотни готовых палитр.
🌌 Космический хоррор / Sci-Fi
▪️ Цвета: Холодные, приглушённые. Синие, зелёные, серые тона. Яркие акценты только на интерфейсе.
▪️ Пример: Основной — #1C2E45, металл — #7A93A5, свет панелей — #00FFE0.
▪️ Зачем: Давление, одиночество, холод техники. Красный сигнал тревоги будет врезаться в память.
▪️ Лайфхак: В постобработке (Color Grading) сдвинь баланс белого в синий.
☀️ Казуальная 3D-аркада / Гонки
▪️ Цвета: Тёплые, «летние». Нежно-голубой небо (#87CEEB), зелёная трава (#7CFC00), яркие элементы геймплея (красный, оранжевый).
▪️ Пример: Фон — пастельный, игровые объекты — насыщенные.
▪️ Зачем: Чувство лёгкости, позитива. Игрок не напрягается.
▪️ Правило: Небо и земля — светлые и ненасыщенные. Герой/машина — самый яркий пятно.
🧟 Выживание / Пост-апокалипсис
▪️ Цвета: Землистые, грязные. Коричневый (#4A3728), тускло-зелёный (#5A7D5A), грязно-жёлтый (#B5A642).
▪️ Пример: Нет чистых красок. Всё будто в пыли.
▪️ Зачем: Передать атмосферу упадка, истощения ресурсов.
▪️ Фишка: Добавь поверх всего лёгкий оверлей (Color Grading) с оттенком сепии или серого.
⚡️ Ключевой принцип: 60-30-10
• 60% экрана — доминирующий цвет (фон, земля).
• 30% — вторичный цвет (объекты, здания).
• 10% — акцентный цвет (герой, враги, кнопки, коллекционные предметы).
Именно эти 10% цвета игрок запомнит. Сделай их контрастными!
💭 Как внедрить?
1. Закрепи в сцене простой материал с нужной палитрой.
2. Настрой освещение (Temperature в лайтах) под цветовую гамму.
3. Используй Pixelator или Palette Editor из Asset Store для быстрого подбора.
✅ Вывод: Цвет — это невидимый геймдизайнер. Он направляет взгляд и создаёт настроение.
📌 Сохрани эту схему перед началом следующего проекта!
🔔 Подпишись — завтра покажу, как через Shader Graph за 5 минут сделать стилизацию под любой жанр.
💬 В каком жанре делаешь игру? Как подбираешь цвета? Пиши в комментах!
👉Akrus Games | Unity
👍5👎4❤1
✅ C# Атрибуты в Unity: мета-инструкции для кода
Что это?
Специальные метки для классов, переменных или методов. Они дают подсказки движку и редактору Unity, как с ними работать.
Зачем?
- Делать переменные видимыми в Инспекторе без ключевого слова public
- Задавать диапазоны значений для ползунка
- Добавлять в контекстное меню кнопки для вызова методов
- Скрывать ненужные поля в Инспекторе
Как использовать?
Просто напиши имя атрибута в квадратных скобках [] перед элементом.
Популярные атрибуты:
[SerializeField]
Показывает private поле в Инспекторе.
[Range(min, max)]
Создает ползунок для значения.
[Header("Название")]
Добавляет заголовок в Инспектор.
[Tooltip("Подсказка")]
Показывает текст при наведении курсора.
[HideInInspector]
Прячет public поле из Инспектора.
Важно!
Атрибуты не меняют логику кода, а только управляют его отображением и поведением в редакторе Unity. НО есть атрибут Obsolete который не относится к юнити и не влияет на отображение в редакторе. Еще в поля можно писать только константы, не переменные!
💡 Используй, чтобы сделать процесс настройки объектов интуитивным и удобным.
#Unity #Unity3D #CSharp #Атрибуты #Gamedevelopment
Что это?
Специальные метки для классов, переменных или методов. Они дают подсказки движку и редактору Unity, как с ними работать.
Зачем?
- Делать переменные видимыми в Инспекторе без ключевого слова public
- Задавать диапазоны значений для ползунка
- Добавлять в контекстное меню кнопки для вызова методов
- Скрывать ненужные поля в Инспекторе
Как использовать?
Просто напиши имя атрибута в квадратных скобках [] перед элементом.
Популярные атрибуты:
[SerializeField]
Показывает private поле в Инспекторе.
[SerializeField] private int _health;
[Range(min, max)]
Создает ползунок для значения.
[Range(0f, 10f)] public float speed;
[Header("Название")]
Добавляет заголовок в Инспектор.
[Header("Player Settings")]
public int playerScore;[Tooltip("Подсказка")]
Показывает текст при наведении курсора.
[Tooltip("Сила прыжка в ньютонах")]
public float jumpForce;[HideInInspector]
Прячет public поле из Инспектора.
[HideInInspector] public bool isGrounded;
Важно!
Атрибуты не меняют логику кода, а только управляют его отображением и поведением в редакторе Unity. НО есть атрибут Obsolete который не относится к юнити и не влияет на отображение в редакторе. Еще в поля можно писать только константы, не переменные!
💡 Используй, чтобы сделать процесс настройки объектов интуитивным и удобным.
#Unity #Unity3D #CSharp #Атрибуты #Gamedevelopment
🔥8🎄2
⚡️ 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