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

Сотрудничество/реклама/помощь @Akrus001
Download Telegram
⚡️ Unity: Классы, Наследование — Базовый Арсенет для Логичной Архитектуры

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

🧱 Классы в Unity — это чертежи твоих объектов
Они описывают, что объект может делать и какие данные хранить. Всё в C# построено на классах. В Unity каждый твой скрипт — по умолчанию класс.

public class Enemy
{
public int health = 100;
public void Attack() { /* Логика атаки */ }
}


🔄 Наследование — Когда «Враг» и «Босс» имеют общее
Зачем копировать один и тот же код? Создай базовый класс и унаследуй от него.

🎯 Вариант 1: Классическое наследование (Иерархия «is-a»)

Идеально, когда у объектов общая логика, но есть специфика.

// Базовый класс для ВСЕХ врагов
public class Enemy : MonoBehaviour
{
[SerializeField] protected int health; // protected — видно в наследниках

public virtual void TakeDamage(int damage)
{
health -= damage;
Debug.Log($"Enemy health: {health}");
}
}

// Конкретный тип врага
public class FlyingEnemy : Enemy
{
public override void TakeDamage(int damage)
{
base.TakeDamage(damage); // Вызов метода из родителя
// Уникальное поведение для летающего врага
if (health < 30) FlyAway();
}
}

➡️ Когда использовать: Чёткая иерархия (например, EnemyMeleeEnemy / RangedEnemy). Логика общая, но дополняется.

🎯 Вариант 2: Композиция + ScriptableObject (Гибкость «has-a»)

Чаще используется в современных подходах. Разделяй данные и поведение.

// Данные врага вынесены в отдельный объект
[CreateAssetMenu]
public class EnemyData : ScriptableObject
{
public int health;
public int damage;
public GameObject prefab;
}

// Основной класс врага использует данные
public class Enemy : MonoBehaviour
{
public EnemyData data;
private int currentHealth;

void Start()
{
currentHealth = data.health; // Берём данные из ScriptableObject
}
}

➡️ Когда использовать: Нужна быстрая настройка и вариативность (10 типов врагов с разными HP/уроном). Легко балансить игру без изменения кода.

💎 Итог:
Наследование — строй иерархию «от общего к частному».
Композиция (использование отдельных классов/данных) — чаще практичнее в геймдеве.
• В Unity MonoBehaviour — уже базовый класс. Твои скрипты наследуются от него.

📌 Правило для инди: Начинай с простого наследования для 2-3 типов врагов. Когда появится 10+ типов с кучей параметров — выноси данные в ScriptableObject.

💬 Твой код больше похож на первый или второй вариант? Делись в комментах!
🔔 Подпишись — дальше разберём интерфейсы и абстрактные классы на реальных примерах из игр.
👉Akrus Games | Unity
🔥74👍11
💀

Каникулы заканчиваются, админ начинает писать посты
🎄14🔥4👎1😁1
БЕСПЛАТНЫЙ ассет GIZMO MONSTER

Этот набор содержит 6 монстров с анимацией

Используйте размер 32x32, подходит для фэнтези, данженов и игр на выживание, и он будет продолжать обновляться!

Ссылка
🔥51👎11
Как создавать собственные классы и наследовать их в C# Unity

Классы — это шаблоны для объектов. Наследование помогает экономить время.

Представь, что ты строишь домики из кубиков. Класс — это набор инструкций, как сложить кубики. Наследование — когда ты берёшь готовый домик и добавляешь к нему крышу или окно, не перестраивая всё заново. В Unity так можно делать с объектами: взять базовый класс (например, «Персонаж») и создать на его основе «Воина» или «Мага», добавив особые умения.

Шаг 1. Создаём базовый класс

Открой Unity, создай новый C#‑скрипт (через контекстное меню в Assets → Create → C# Script). Назови его, например, Character.

Отредактируй скрипт:

using UnityEngine;

public class Character : MonoBehaviour
{
public int health = 100;
public float speed = 5f;

public virtual void TakeDamage(int damage)
{
health -= damage;
Debug.Log("Урон получен! Здоровье: " + health);
}
}


Что тут есть:
- public int health = 100 — здоровье персонажа (число).
- public float speed = 5f — скорость движения (дробное число).
- TakeDamage — метод, который уменьшает здоровье при получении урона.

Шаг 2. Создаём класс‑наследник

Создай ещё один скрипт, назови его Warrior.

Отредактируй скрипт:

using UnityEngine;

public class Warrior : Character
{
public int shield = 20;

public override void TakeDamage(int damage)
{
int finalDamage = damage - shield;
if (finalDamage > 0)
{
health -= finalDamage;
}
Debug.Log("Воин получил урон! Здоровье: " + health + ", щит: " + shield);
}
}


Что изменилось:
- public class Warrior : Character — говорим, что Warrior наследует Character.
- public int shield = 20 — добавили щит (новое свойство).
- override void TakeDamage — переопределили метод, чтобы учитывать щит.

Шаг 3. Проверяем в Unity

1. Создай пустой GameObject на сцене (правый клик в иерархии → Create Empty).
2. Прицепи к нему скрипт Warrior (перетащи скрипт на объект в инспекторе).
3. Запусти игру и посмотри в Console — при вызове TakeDamage ты увидишь логи с учётом щита.

Важные моменты

Наследуй, чтобы не писать код заново.
🔥6👎31
Возможно, у кого-то есть старый аккаунт Google Play Разработчика (до 2023 года). Есть возможность хорошо заработать на этом.

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

По любым вопросам в ЛС @Ilya01s.
9🔥31
Akrus Games | Unity pinned «Возможно, у кого-то есть старый аккаунт Google Play Разработчика (до 2023 года). Есть возможность хорошо заработать на этом. Закрытые за неактив аккаунты тоже принимаются(их можно восстановить) По любым вопросам в ЛС @Ilya01s.»
Как вам новый формат постов?
Я решил сделать акцент на доступность новичкам.
Anonymous Poll
40%
Имба
21%
Верни старый формат
19%
Пойдет
19%
тык
2
Присылайте свои работы в комментарии!👊
Лучшие выложу здесь!


Присылайте лучше видео. Хороший компрессор https://tools.rotato.app/compress

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

🎧Akrus Games | Unity
👍3
Игра подписчика @b4nukk
Прикольная 2д стрелялка. Идеальный проект для новичков на текущем этапе.

Канал: а где
Присылайте свои игры сюда
Akrus Games | Unity
9🔥5
Часть будет разыгрываться😏
12🔥22
Игра не подписчика @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