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

Сотрудничество/реклама/помощь @Akrus001
Download Telegram
Игра не подписчика @tromgard
Мой любимый проект из всех, которые я видел.
2д выживач в апокалипсисе. Очень имбовая графика и палитра цветов

Канал: https://t.me/Pigeonofsorrowch
Поиграть онлайн: http://82.202.137.211/ обязательно включите полноэкранный режим
Присылайте свои игры сюда
Akrus Games | Unity
8🔥5🎄1
Работа подписчика @MounSword_Gtima
Гриб
+ желаю всем хорошей выходных!!!

Канал: https://t.me/MSwordStudio
Присылайте свои игры сюда
Akrus Games | Unity
8
This media is not supported in your browser
VIEW IN TELEGRAM
Игра подписчика @code_n_polygons
Сделал для ГГ квартиру 😁
Игроку — отдых от локации с проверками.
ГГ — свой safe space.

Это уже вторая локация проекта Don't Stay Late. Пока что все накидано довольно широкими мазками, но, самое главное — начало положено

Заинтересовал проект?
Приглашаю подписаться на канал, где выкладываю девлоги по нему. Буду рад каждому вступившему

Канал: @code_n_polygons
Присылайте свои игры сюда
Akrus Games | Unity
7👍3🔥11
👍411
⚔️ Unity: как сделать, чтобы игра не казалась казуальной?

Хочешь, чтобы твою инди-игру воспринимали всерьёз, а не как лёгкий таймкиллер? Вот ключевые точки, где нужно сместить акценты.

1️⃣ Сложность: дай игроку пространство для ошибки, но сделай её дорогой
Не добавляй «бесконечные жизни». Лучше одна сложная, но честная проверка навыков.
Откажись от автопомощи в геймплее: никаких автоприцелов или подсказок "нажми сюда" без крайней нужды.
Введи перманентные последствия: потеря ресурса, изменение мира, перманентная смерть (permadeath) для хардкорного ощущения.

2️⃣ Визуал и атмосфера: серьёзный тон вместо «милоты»
Цветовая палитра: избегай слишком ярких, "мультяшных" цветов. Используй приглушённые, контрастные тона.
Звук и музыка: атмосферный саундтрек, а не весёлые мелодии. Звуки должны быть "тяжёлыми" — шаги, удары, скрипы.
Шейдеры и постобработка: добавь эффекты зерна (Film Grain), хроматических аберраций, виньетирования. Это создаёт "кинематографичную" и взрослую картинку.

3️⃣ Глубина механик: игрок должен думать, а не просто тапать
Нелинейность: несколько путей прохождения, скрытые зоны, секреты, которые не подсвечены.
Система крафта/прокачки с выбором: не "улучши всё", а "выбери ветку, откажись от другого". Это создаёт осмысленность.
Динамические системы: NPC, которые живут своей жизнью, погода, влияющая на геймплей, последствия выбора.

4️⃣ Подача и интерфейс (UI/UX): минимализм и отсутствие "руки-водилки"
Чистый, сдержанный интерфейс. Никаких пузырьков, мигающих стрелок или детских шрифтов.
Обучение через практику. Не текстовые стены туториала, а интеграция обучения в геймплей (как в Dark Souls).
Скрытая статистика и механики. Пусть игрок сам экспериментирует и открывает взаимодействия.

💡 Главный принцип: УВАЖАЙ игрока. Дай ему вызов, доверь его интеллекту, погрузи в атмосферу. Игра перестаёт быть казуальной, когда к ней нужно относиться серьёзно.

🔔 Подписывайся, чтобы не пропустить разборы конкретных техник: от сложного AI до создания мрачной атмосферы в URP.

💬 А что, по-твоему, убивает "казуальность" в игре? Делитесь в комментариях! 👉 Akrus Games | Unity
🔥9👍43
⚙️ 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🔥11
А вы можете?
Лично я не могу(максимум перезагрузить)
16
Бесплатный ассет RPG Icons

Набор из 25 пиксель арт иконок для ваших проектов

Ссылка: вот здесь
5🔥3
🎨 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👎41
C# Атрибуты в Unity: мета-инструкции для кода

Что это?

Специальные метки для классов, переменных или методов. Они дают подсказки движку и редактору 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 раз в секунду — дикая нагрузка, если это не требуется.

📌 Что делать: Вместо 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)

Практика:
// Генерация случайного тайла в коде:
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
Дуров о блокировке тг в России.
Я телеграмм не заброшу, сейчас буду наиболее активно развивать канал. Так что ждите новую имбу.

Почему у него в канале только положительные реакции🧐
🔥16👍2
Akrus Games | Unity
Video
⚡️ Подсветка объектов при наведении

Хочешь, чтобы игрок видел, на что можно кликнуть? Базовый, но важный приём.

Через 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
АХАХАХ.

С этого дня буду писать годные посты каждый день. Так что подписывайтесь!
1👍8🔥4👎1😁1