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

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

Как ваши успехи за этот день? Расскажите что получилось в комментариях!
😁72🔥1
👁️ Как создать «зрение» ИИ врага в Unity?

Легко!

Давайте рассмотрим процесс поэтапно:

1️⃣ 1. В двухмерном пространстве можно просто отправить один рейкаст в направлении игрока и проверить, происходит ли столкновение.
2️⃣ 2. Однако, если игрок слегка выглядывает из-за угла и его видно, то этот способ не подойдёт. В таком случае, следует отправлять несколько рейкастов веером и проверять, сталкиваются ли они с чем-либо.
3️⃣ 3. Но что делать в трёхмерном пространстве? Не отправлять же миллион рейкастов!

Для этого можно воспользоваться коллайдером, проверить столкновения и отправить пучок рейкастов!

---

"Все гениальное просто, все простое гениально"


👍 Ставьте лайк и подписывайтесь на канал!
#unity #charp #gamedev #ии #unity3d
5🔥41
⚔️ Unity: 3D или 2D? Выбирай правильное направление

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

🎨 Визуал и стиль

2D:
•Спрайты, пиксель-арт, вектор — полный контроль над каждым пикселем.
•Легче создать уникальный и цельный художественный стиль.
•Особенность: Вся «глубина» создаётся вручную (параллакс, слои).

3D:
•Объём, камеры с любого ракурса, динамическое освещение.
•Современный «AAA-вид» даже на простых моделях с постобработкой.
•Особенность: Требует навыков в моделировании, текстурировании, работе с освещением.

🎮 Геймдизайн и механики

2D:
•Идеально для платформеров, раннеров, казуальных и мобильных игр.
•Геймплей чаще линейный и сфокусированный.
•Фишка: Проще проектировать уровни и баланс — всё перед глазами.

3D:
•Полная свобода движения, открытые миры, сложные тактические бои.
•Механики могут быть глубокими (физика, стелс, исследование).
•Фишка: Сложнее отладить и сбалансировать — добавляется третья ось.

⚡️ Производительность и порты

2D:
•Меньше нагрузка на рендеринг — выше FPS на слабых устройствах.
•Проще портировать на мобилки и веб.
•Важно: Оптимизация спрайтов и анимаций — ключ к скорости.

3D:
•Автоматическая оптимизация (LOD, окклюзия) встроена, но её нужно настраивать.
•Тяжелее для мобилок — требует уменьшения полигонов, текстур, освещения.
•Важно: Пайплайн сложнее — от модели до импорта в Unity.

🚀 Сложность входа

2D:
•Проще начать: не нужны 3D-редакторы, можно рисовать даже в простых программах.
•Меньше подводных камней с камерой, управлением, физикой.
•Совет: Идеально для первого коммерческого проекта.

3D:
•Требует больше навыков: моделирование, UV-развёртка, скелетная анимация.
•Нужно разбираться в материалах, шейдерах, системах частиц для 3D.
•Совет: Выбирай 3D, если готов изучать Blender/Maya или работать в команде с художником.

Итог:
•Выбирай 2D, если делаешь игру в одиночку, хочешь быстрее выпустить продукт и фокусируешься на геймплее, а не на графике.
•Выбирай 3D, если цель — современная графика, глубокие механики движения/боя и есть время/ресурсы на освоение полного пайплайна.

💬 А ты за какой подход? Делись в комментах!
📌 Сохрани пост, чтобы не потерять перед стартом нового проекта.
🔔 Подпишись — больше жёстких сравнений и практических гайдов по Unity!

👉Akrus Games | Unity
4🔥1
Иметь пк в 2030: 😎
😁172
⚡️ Unity: игра весит слишком много? Шпаргалка по сжатию

Сохрани этот чек-лист! Пройди по каждому пункту — легко сбросишь 30-70% лишнего веса.

1️⃣ Editor → первым делом смотри сюда

📁 Размер сборки (Build Size Report)
ВкладкаConsole → переключи в режим Editor → выбери Add → Build Size Report.
После сборки появится детальный отчёт:что именно тянет больше всего МБ.

2️⃣ Текстуры — главный пожиратель места

🎯 Настройка для каждой текстуры:

· Max Size: Не ставь больше, чем нужно для экрана. UI? Часто хватит 512px.
· Compression: Используй ASTC для мобилок (качество/размер), DXT5 для ПК.
· Format: Всегда проверяй RGBA 32 bit → меняй на Compressed. В 4-8 раз меньше!
· Mip Maps: Отключай для UI и 2D-спрайтов. Они съедают ~30% памяти.

3️⃣ Аудио: пережатие всё решает

🔊 Идеальный профиль для мобильных игр:

· Load Type: Для коротких звуков — Decompress On Load. Для фоновой музыки — Streaming.
· Compression Format: Для большинства эффектов — Vorbis. Качество (Quality) ставь 0.5-0.7. Размер упадёт в разы!
· Force To Mono: Для 3D-звуков включи эту галочку. Размер ÷ 2.

4️⃣ Мусор в ассетах и настройках проекта

🗑️ Чистим лишнее:

· Unused Assets: Удали из проекта неиспользуемые материалы, префабы, скрипты. Поможет Asset Cleaner или вручную.
· Standalone Build Settings: Если делаешь мобильную игру — в Player Settings → Resolution and Presentation отключи все ненужные разрешения для десктопа.
· Strip Engine Code: Player Settings → Other Settings → галочка Strip Engine Code (может сломать рефлексию, тестируй!).

5️⃣ Оптимизация самой сборки (Build)

⚙️ Два ключевых выключателя:

· Build Compression: В окне Build Settings выбери Compression Method = LZ4HC (быстро) или LZMA (сильнее сжатие, но дольше распаковка).
· Create .apk (Android) вместо .aab для тестовых сборок, если не публикуешь в Google Play. Файл будет меньше.

Итог: Сначала смотри Build Report, потом дави на текстуры и аудио. Часто этих двух шагов хватает, чтобы ужать игру в 2 раза.

💬 Сталкивался с гигантским размером? Как решил проблему?
🔔Подпишись — впереди много шпаргалок по оптимизации и не только!

👉Akrus Games | Unity
🔥92
⚡️ Unity: 4 средние по сложности функции C#, которые надо знать каждому (для новичков)

Сохраняй шпаргалку — это не база, а именно тот уровень, который отличает новичка от уверенного мидла. Употребляешь их — код становится чище, а задачи решаются быстрее.

1️⃣ LINQ: Where, Select, FirstOrDefault

📌 Зачем: Работа с коллекциями без велосипедных for и лишних списков.

// Было:
List<Enemy> aliveEnemies = new List<Enemy>();
foreach (var enemy in allEnemies)
{
if (enemy.IsAlive) aliveEnemies.Add(enemy);
}

// Стало:
var aliveEnemies = allEnemies.Where(e => e.IsAlive).ToList();

🔸 Особенности:

· Всегда using System.Linq;
· Where — фильтрует. Select — преобразует. FirstOrDefault — находит первый или возвращает null.
· Не забывай .ToList() или .ToArray() в конце, если нужна новая коллекция, иначе получишь IEnumerable, который выполнится заново при каждом обращении.
· На больших данных или в Update() может просаживать производительность. Для критичных мест иногда лучше старый добрый цикл.

2️⃣ События (Events) с Action / Func

📌 Зачем: Чистая и безопасная реализация Observer паттерна. Развязывает связи между скриптами.

// Объявление события
public static event Action<Item> OnItemPickedUp;

// Вызов
void PickUp(Item item) {
OnItemPickedUp?.Invoke(item); // Проверка на null
}

// Подписка в другом скрипте
void OnEnable() => Player.OnItemPickedUp += HandlePickUp;
void OnDisable() => Player.OnItemPickedUp -= HandlePickUp; // ОТПИСКА ОБЯЗАТЕЛЬНА!

🔸 Особенности:

· Action — для void методов. Action<int> — для методов с параметром.
· Func<int, string> — когда нужно возвращать значение (последний тип-параметр — возвращаемый).
· Всегда отписывайся! (OnDisable, OnDestroy). Иначе будет утечка памяти и ошибки.
· ?.Invoke() — безопасный вызов, если на событие никто не подписан.

3️⃣ Coroutine + yield return новые инструкции

📌 Зачем: Сложные последовательности и тайминги.

IEnumerator AttackSequence() {
yield return new WaitForSeconds(1f); // Ждём секунду
PlayAnimation("Attack");
yield return new WaitForEndOfFrame(); // Ждём конец кадра
ApplyDamage();
yield return StartCoroutine(CooldownRoutine()); // Вкладываем одну корутину в другую
yield return null; // Ждём один кадр (устаревший вариант, лучше WaitForEndOfFrame)
}

🔸 Особенности:

· yield return new WaitForSecondsRealtime(time) — работает даже если Time.timeScale = 0 (для паузы).
· yield return new WaitUntil(() => condition) — ждём, пока условие станет true. Мощная штука!
· Корутину можно остановить StopCoroutine() или StopAllCoroutines().
· Не забывай проверять, активен ли объект (gameObject.activeInHierarchy), прежде чем начинать.

4️⃣ StringBuilder для динамических строк

📌 Зачем: Когда собираешь длинный лог, JSON, текст UI или много строк в цикле.

// ПЛОХО (создаётся куча мусора):
string result = "";
for (int i = 0; i < 100; i++) {
result += i.ToString(); // КАТАСТРОФА ПРОИЗВОДИТЕЛЬНОСТИ
}

// ХОРОШО:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++) {
sb.Append(i);
}
string finalResult = sb.ToString();

🔸 Особенности:

· using System.Text;
· В Update() или часто вызываемых методах обязательно использовать.
· Можно AppendLine(), AppendFormat(), Clear().
· Инициализируй с запасной ёмкостью, если знаешь длину: new StringBuilder(500).

Знать эти функции — мало. Надо понимать когда и зачем их применять. Это и есть скилл.

💬 Какую из этих функций используешь чаще всего? Есть ли свои фишки?
🔔Подпишись — скоро разберём ещё одну пачку: от делегатов до асинхронных операций в Unity.

👉Akrus Games | Unity
🔥721
Маи чуваки. В канале проблема: люди отписываются и актив падает.
Что делать?
Оставлять ли образовательные посты(темы становятся сложнее и качество падает)?
Anonymous Poll
65%
Оставлять
7%
Убрать(свой вариант в комментарии на что заменить)
28%
Оставить частично(свой вариант в комментарии что добавить)
65
Присылайте свои работы в комментарии!👊
Лучшие выложу здесь!


По поводу вчерашнего опроса:
1. Буду публиковать какие нибудь девлоги
2. Будут больше интерактива
3. На первое время кол-во образовательных постов снизится

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

🎧Akrus Games | Unity
11🔥53
This media is not supported in your browser
VIEW IN TELEGRAM
Игра подписчика @ImCapibara
Чуть-чуть вспотел, но удалось под новую систему и эту игру доделать поведение башни при передвижении.

Башня немного опережает корпус, корпус больше не имеет "атакующих" способностей, т.е. это больше не солдат.

+ башня поворачивается по локальному повороту, позже только порезать ей скорость, а то сильно быстрая и будет имба. ✔️

Канал: https://t.me/UmnayaCapibara
Присылайте свои игры сюда
Akrus Games | Unity
8🔥32
Игра подписчика @kyeyeORqueue
Механика открытия кейсов
Еще не та шляпа по размеру)

Канал: https://t.me/home_lilya
Присылайте свои игры сюда
Akrus Games | Unity
82
This media is not supported in your browser
VIEW IN TELEGRAM
Игра подписчика @viseweb
Звездный шутер с крутой оптимизацией для мобилок

Канал: https://t.me/visedev
Присылайте свои игры сюда
Akrus Games | Unity
103🤯1
Media is too big
VIEW IN TELEGRAM
Игра подписчика @ITerafy
Все хардкор моды PvZ в одном виде

Решили сделать одну из самых сложных игр с PvZ-тематикой (+ свои усложняющие механики, как передвижение животных по полю, особые боссы).

Но для проходимости и динамики игрок так-же сможет участвовать в сражении, стреляя курсором.

Следить за проектом можно будет тут - @TerafyMain

Канал:
@TerafyMain
Присылайте свои игры сюда
Akrus Games | Unity
🔥92
Актуально как никогда.


Завтра будет образовалочка
11🎄1
Unity: enum, state и switch

Чтобы не было десяти миллионов if else, можно использовать Switch+enum. Рассмотрим на примере состояний:
switch (state)//что рассматриваем
{
default:
case State.Idle:
//если idle, то ничего не делаем
break;//завершаем
case State.Roaming:
roamingTime -= Time.deltaTime;
if (roamingTime < 0)
{
Roaming();
roamingTime = roamingTimerMax;
}
//ecли roaming выполняем действие
break;
case State.Attack:
navMeshAgent.SetDestination(player_pos.position);
break;

}

Важно!
это не полная замена if/else, а частный случай для оптимизации при одномерном выборе.


Таким образом можно рассматривать состояния более оптимизированным способом. Попробуйте внедрить это в свой проект и код будет надежнее(компилятор предупредит о возможных проблемах), удобней(можно проще добавить новые состояния) и читаемее.

Akrus Unity
7🔥421
⚡️ Unity: Интерфейсы в C# — сила контрактов

Интерфейс — это контракт, который гарантирует, что класс умеет делать определённые действия. Неважно, кто его подписал — игрок, враг или бочка. Главное — они все могут выполнить условия контракта.
В интерфейсах в c# не принято делать реализацию функций, свойств, только объявление.

🔥 Зачем это в играх?

Допустим, у тебя есть меч, который может бить врагов и ломать бочки. Без интерфейсов — это ад из if (collider.GetComponent<Enemy>() != null)... С интерфейсами — чисто и гибко.

Можно наследовать от любого количества интерфейсов, в отличии от наследования от классов.

Если мы хотим сделать приватное свойство для реализующего интерфейс класса, мы можем не указывать set в свойстве интерфейса

🎯 Реальный пример: взаимодействие с объектами

public class Bullet : MonoBehaviour
{
private const int _damage = 10;

private void CheckHit()
{
//проверка столкновений с IHealth
hitObj.TakeDamage(_damage);
}
}

public class Player : MonoBehaviour, IHealth
{
// Реализация свойства
public int Health { get; private set; }
// Прочие поля
// Прочии свойства
// Прочии функции

// Реализация функции
public void TakeDamage(int damage) =>
Health -= damage;
}

public interface IHealth
{
// Обьявление свойства Health
int Health { get; }
// Обьявление функции TakeDamage
void TakeDamage(int damage);
}


💡 Два главных плюса:

🔸 Гибкость — добавляй новые разрушаемые объекты без изменения кода меча
🔸 Чистота — избавляешься от гигантских цепочек проверок через GetComponent

🚀 Где ещё использовать?

IInteractable для взаимодействия с NPC, дверями, предметами
ICollectable для сбора монет, аптечек, боеприпасов
ISaveable для системы сохранений

💬 Используешь интерфейсы в своих проектах? Делися в комментах!

🔔 Подпишись — ещё больше C# фишек для геймдева

Пост помог написать @Nokskiy
👉Akrus Games | Unity
7🔥33
Мы объединились и создали лучшую папку каналов по геймдеву "The Gamedev"!

Это место, где собраны самые полезные, активные и вдохновляющие каналы индустрии, где каждый разработчик найдёт для себя что-то действительно ценное:

🧑‍💻 Помощь и практические советы по разработке игр

🆓 Бесплатные раздачи ассетов и промокоды

📣 Актуальные новости геймдева

💰 Советы по заработку на разных игровых площадках

📱 Авторские каналы по геймдизайну

📸 Личные блоги разработчиков


Подключайтесь к папке The GameDev и станьте частью сильного комьюнити!

👉 https://t.me/addlist/rzxpwkhTW65hNDQy
🔥136🤯2
Привет всем новым подписчикам! Я @akrus001 админ этого канала.
В это канале в основном публикуются обучающие посты. Иногда что-то более интерактивное.
Раз в неделю я делаю пост, куда можно прислать свои работы. Самые лучшие я опубликую в канал(классно сделал = бесплатная реклама)

Вот сборка лучших обучающих постов
Чат канала @chatAkrus001
Админ @akrus001, по любым вопросам можете спросить.
Советую вам почитать предыдущие посты.

Надеюсь вам здесь понравится!
🔥20431
Знаешь, когда два дня чинишь одну строку кода, а игра всё равно ломается? У меня так было с машинкой, которая кувыркалась на поворотах.

Я потратил 48 часов на поиск бага в физике. Проверил всё. А оказалось, что я использовал ForceMode.Impulse в FixedUpdate, и силы накапливались, создавая «толчки великана». Два дня — на одну строку. Когда нашёл, смеялся и плакал.

Так вот, что здесь важно:
1. ForceMode в Unity — способ приложения силы. Impulse мгновенно добавляет импульс, а в FixedUpdate он может вызываться слишком часто.
2. Физику считают в FixedUpdate, но осторожно.
3. Дебаг начинай с простого. Я лез в дебри, не проверив базовое.

Как не сгореть? Чек-лист:

🔹 Таймер для перерывов. 25 минут работы, 5 минут отдыха.
🔹 Версия 0.1 должна быть уродливой, но работающей. Не гонись за идеалом сразу.
🔹 Геймдиз-док на одной странице. Если не объяснишь игру в трёх предложениях — утонешь.
🔹 Не создавай 1000 ScriptableObject’ов в одной папке. Группируй данные, иначе проект станет свалкой.
🔹 Ищи баг с конца. Начни с последнего изменения. Git — твой друг.
🔹 День без кода — это нормально. Решение часто приходит во время отдыха.
🔹 Показывай игру другу, даже сырую. Со стороны баги виднее.

Ошибки — это не «я плохой», а «я расту». Каждый найденный баг — новый уровень.

Было похожее? 💬 Напиши — разберём. Если тема зашла, сделаю серию про частые косяки. Держись! 🚀
18🔥43🎄1
Фото игры
9🔥22