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

Сотрудничество/реклама/помощь @Akrus001
Download Telegram
😂
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1132
Custom Editor Tools: ускорь workflow в редакторе

Что это?
Создание собственных окон и кнопок в редакторе Unity для автоматизации рутины.

Зачем?
- Массовое переименование префабов
- Автоматическое размещение объектов по правилу
- Валидация данных на сцене
- Создание уникального инструментария под ваш проект

Пример: кнопка для спавна префабов в сцене:
[CustomEditor(typeof(LevelManager))]
public class LevelManagerEditor : Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector(); // Рисует стандартные поля

LevelManager myScript = (LevelManager)target;
if(GUILayout.Button("Spawn Enemy Wave")) // Кнопка в инспекторе
{
myScript.SpawnEnemyWave(); // Вызывает метод из скрипта
}
}
}

Пример 2: Утилита для переименования:
public class RenamerTool : EditorWindow
{
private string baseName = "Enemy_";
[MenuItem("Tools/My Renamer")] // Добавляет пункт в меню
public static void ShowWindow() => GetWindow<RenamerTool>("Renamer");

void OnGUI()
{
baseName = EditorGUILayout.TextField("Base Name", baseName);
if (GUILayout.Button("Rename Selection"))
{
foreach(GameObject obj in Selection.gameObjects)
{
obj.name = baseName + obj.GetInstanceID();
}
}
}
}

Важно!
- Весь код инструментов оборачивай в #if UNITY_EDITOR ... #endif
- Не используй в редакторе GameObject.Find, используй Selection.gameObjects или FindObjectsOfType

💡 Создавай инструменты для дизайнеров уровней и художников — они скажут спасибо!

#Unity #Editor #Tools #Productivity #Workflow
🔥811
💻⚡️ Прокачивайте скорость печати и почувствуйте себя настоящим хакером!

Нашел браузерную игру, где надо вводить реальные команды быстро и без ошибок, чтобы взломать систему до срабатывания тревоги.

🤔 Каждая ошибка — риск быть замеченным и провалить миссию.

👉 Начинаем прокачку скорости печати здесь
🔥61😁1
Unity ECS на практике: Пишем первую систему

Следующий шаг
Разберем, как преобразовать обычные GameObject в Entity и работать с ними.

1. Гибридный подход (MonoBehaviour -> Entity)
- Добавь на GameObject компонент ConvertToEntity
- Он автоматически преобразует объект и его дочерние элементы при старте

2. Authoring (Создание данных в редакторе)
Пишем MonoBehaviour-обертку для визуальной настройки.
public class RotationSpeedAuthoring : MonoBehaviour
{
public float DegreesPerSecond = 360f;
}

// "Повар" преобразует Authoring в ComponentData
public class RotationSpeedAuthoringBaker : Baker<RotationSpeedAuthoring>
{
public override void Bake(RotationSpeedAuthoring authoring)
{
var entity = GetEntity(TransformUsageFlags.Dynamic);
AddComponent(entity, new RotationSpeed
{
RadiansPerSecond = math.radians(authoring.DegreesPerSecond)
});
}
}

3. Система с зависимостями
Системы могут требовать наличие других компонентов.
// Система, которая работает только с объектами, у которых есть RotationSpeed и Rotation
[UpdateInGroup(typeof(SimulationSystemGroup))]
public partial struct MyRotationSystem : ISystem
{
public void OnUpdate(ref SystemState state)
{
foreach (var (transform, speed) in
SystemAPI.Query<RefRW<LocalTransform>, RefRO<RotationSpeed>>())
{
transform.ValueRW = transform.ValueRO.RotateY(
speed.ValueRO.RadiansPerSecond * SystemAPI.Time.DeltaTime
);
}
}
}

4. Важные нюансы:
- RefRO - Read Only доступ (только чтение)
- RefRW - Read Write доступ (чтение и запись)
- Используй SystemAPI.Query для итерации по сущностям с нужными компонентами
- Все изменения автоматически параллелятся Burst компил💡 Совет: Начинай с малого — перенеси в ECS самые тяжелые части (частицы, ИИ). Не нужно переписывать всё сразу.

#Unity #ECS #DOTS #Performance #Burst
🔥51
C# Events в Unity: Избавься от спагетти-кода

Что это?
Паттерн, позволяющий объектам общаться друг с другом без прямых ссылок.

Зачем?
- Сильно снизить связность кода
- Делать код modular и переиспользуемым
- Легко добавлять новую реакцию на событие (звук, анимацию, UI)
- Избегать постоянных проверок в Update (if (isDead) {...})

Как создать?
1. Объяви делегат и событие
2. Подпиши метод на событие
3. Вызови событие, когда что-то произошло

Пример (Смерть игрока):
public class PlayerHealth : MonoBehaviour
{
// 1. Объявляем событие
public static event Action OnPlayerDeath;

public void TakeDamage()
{
if (health <= 0)
{
// 3. Вызываем событие
OnPlayerDeath?.Invoke();
}
}
}

Как использовать?
public class GameManager : MonoBehaviour
{
void OnEnable()
{
// 2. Подписываемся на событие
PlayerHealth.OnPlayerDeath += HandlePlayerDeath;
}

void OnDisable()
{
// Важно: отписываемся при выключении
PlayerHealth.OnPlayerDeath -= HandlePlayerDeath;
}

void HandlePlayerDeath()
{
// Реакция на смерть игрока
Debug.Log("Game Over!");
Time.timeScale = 0f;
}
}

Важно!
- Всегда отписывайся от событий в OnDisable или OnDestroy, чтобы не было утечек памяти.
- ?.Invoke() проверяет, есть ли подписчики (null-check).

#Unity #CSharp #Events #Delegates #Optimization
🔥732🎄11
Please open Telegram to view this post
VIEW IN TELEGRAM
10😁72
UnityEvents vs Action: когда что использовать?

В чём разница?
Оба подхода реализуют паттерн «наблюдатель», но с разным уровнем гибкости и сложности.

UnityEvent
Идеально для дизайнеров и работы в инспекторе.
Плюсы:
- Виден в инспекторе. Дизайнер уровней может сам настраивать связи между объектами.
- Сериализуется (сохраняется между запусками редактора).
- Простота использования.

Минусы:
- Меньшая производительность по сравнению с Action.
- Не такая гибкая подписка из кода.

Как использовать UnityEvent:
1. Объяви публичное поле в классе:
public UnityEvent OnSomethingHappened;
2. В инспекторе на объекте с этим скриптом появится сворачиваемый список вызовов (Calls).
3. Перетаскивай в него любой объект и выбирай его метод для вызова.

Action
Мощный инструмент для программистов. Работает только в коде.
Плюсы:
- Высокая производительность.
- Чистый и лаконичный синтаксис подписки.
- Полный контроль над подписками и отписками.

Минусы:
- Не виден в инспекторе. Только для программистов.

Как использовать Action:
1. Объяви событие в классе:
public static Action<int> OnEnemyDied;
2. Для вызова события в нужном месте:
OnEnemyDied?.Invoke(scoreValue);
3. В другом классе подпишись на событие:
GameManager.OnEnemyDied += AddScore;
Не забудь отписаться при уничтожении объекта:
void OnDestroy() => GameManager.OnEnemyDied -= AddScore;

Итог:
➡️ Используй UnityEvent для настройки взаимодействий между объектами в инспекторе (двери, кнопки, переключатели).
➡️ Используй Action для быстрых и частых событий внутри кода (система достижений, UI, логика игры).

Выбирай инструмент под задачу! 💪

Пост предложил @Fylht009
#Unity #CSharp #GameDev #Events #Gamedevelopment
🔥7111
Привет!👋 Это Nice GameDev — канал, где два хобби сошлись в одном месте!

🎮 Unity-проекты: Смотри, как игры рождаются с нуля: геймдизайн, код, графика и честный разбор косяков.
⚙️ Железо: Знаю всё о том, как собрать мощный ПК для игр и разработки без переплат. Лайфхаки, тесты и свежие новости.

Подписывайся, чтобы не пропустить ничего интересного!
https://t.me/NicePC_RU
7🔥11
Это очень странно 😑
😁93😱2
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. Еще в поля можно писать только константы, не переменные!

💡 Используй, чтобы сделать процесс настройки объектов интуитивным и удобным.

Пост попросил @Cheeeeeeeb
#Unity #Unity3D #CSharp #Атрибуты #Gamedevelopment
🔥12211
Pattern Matching в C#: Property и Tuple patterns

Зачем?
Упростить проверки сложных условий. Вместо вложенных if — чистый и читаемый код.

Property pattern
Проверяет свойства объекта прямо в условии:

if (weapon is { Ammo: 0, IsReloading: false })
{
// Оружие без патронов и не перезаряжается:
StartReload();
}


Tuple pattern
Идеален для проверки нескольких значений одновременно:

string result = (x, y) switch
{
(0, 0) => "Точка в начале координат",
( > 0, > 0) => "Точка в первой четверти",
( < 0, _) => "Точка слева от оси Y", // _ — любое значение
_ => "Точка в другой области"
};


Где использовать?
• Вместо громоздких if/else для состояний объекта
• Для обработки входных данных (например, результат метода)
• В switch выражениях для возврата значений

Важно!
• Работает в is, switch и switch-выражениях (как выше)
_ — это discard (игнорирование значения)
• В property pattern можно проверять вложенные свойства: Player { Health: { Current: 0 } }

💡 Используй эти паттерны для чистого и безопасного кода. Сокращай количество строк и повышай читаемость!

Пост предложил @u006E10011
#CSharp #Unity #Programming #PatternMatching #UnityDev
8🔥31
Кастомные атрибуты в C#: твой код — чище и умнее

Что это?
Специальные метки для переменных, методов или классов. Они не меняют логику, но дают подсказки движку или редактору.

Зачем?
• Валидация данных прямо в инспекторе
• Красивое и логичное группирование полей
• Сокрытие или запрет на редактирование переменных при определенных условиях
• Автоматизация рутинных задач

Как создать?
Наследуйся от класса PropertyAttribute.

using UnityEngine;

public class HeaderColorAttribute : PropertyAttribute
{
public readonly Color Color;
public HeaderColorAttribute(float r, float g, float b)
{
Color = new Color(r, g, b);
}
}


Как использовать?
Повесь атрибут над полей класса.

public class Player : MonoBehaviour
{
[HeaderColor(1, 0, 0)] // Красный заголовок
[SerializeField] private string _playerName;

[HeaderColor(0, 1, 0)] // Зеленый заголовок
[SerializeField] private int _health;
}


Важно!
• Для отрисовки в инспекторе нужен кастомный Editor скрипт
• Атрибуты работают в рантайме — это мощный инструмент для архитектуры
• Не злоупотребляй сложной логикой в атрибутах

💡 Применяй для: создания понятных инспекторов, валидации настроек, автоматизации.
Создай свой первый атрибут для подсветки поля, если значение отрицательное!

#Unity #CSharp #Programming #Attributes #Gamedev
1🔥521
😎
Please open Telegram to view this post
VIEW IN TELEGRAM
1😁146🔥22😱1
This media is not supported in your browser
VIEW IN TELEGRAM
⚡️ Разработчики игр, внимание!

Kenney Assets собрал сотни бесплатных 2D и 3D ассетов в одном месте — всё, что нужно для быстрого старта проектов:
1️⃣ Текстуры
2️⃣ Спрайты
3️⃣ Звуки
4️⃣ Шрифты
5️⃣ Модели для VR/AR

🎧 Лицензия полностью открытая — используйте в любых проектах, включая коммерческие. Библиотека постоянно обновляется и доступна всем желающим!

👉 Ссылка на библиотеку
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
😊
11355😱1
🤓
Please open Telegram to view this post
VIEW IN TELEGRAM
😁195🔥1
Я заметил: чем меньше постов, тем больше реакций. 😱

Может мне вообще посты не писать?

Извините что не было поста сегодня, я отдыхал☕️

https://t.me/AkrusUnity/600 реакций накидайте, мем же
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
42😁11🎄65211
😱 Находка недели для вас, друзья!

Канал лампового инди, посвященный разработке игр: @TheRoom606

Автор пробует много разного и регулярно публикует посты об этом: от написания игрушек самому с нуля, до вайб-кодинга и заказа разработки.

Подписывайся на канал:

https://t.me/TheRoom606
4🎄4211