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

Сотрудничество/реклама/помощь @Akrus001
Download Telegram
Я создал канал, где буду писать про разработку игр.
Кому интересно вот ссылка https://t.me/AkrusDnevnik
Посты там красиво оформляться не будут
🤯43🔥1
gpt не хватает🤓
Please open Telegram to view this post
VIEW IN TELEGRAM
8
⚡️Собрал ТОП-5 самых полезных горячих клавиш в Visual Studio, которыми пользуюсь сам.

Сохрани — экономит куча времени:

1️⃣ Alt + ↑ / ↓

💡Передвигает строку (или выделенные строки) вверх/вниз! Можно быстро менять порядок кода без копипаста.

2️⃣ Ctrl + K, D

💡 Выравнивает весь код в файле! (Форматирование). Прощай, ручное выравнивание!

3️⃣ Ctrl + K, C

💡Комментирует все выделенные строки. Полезно для тестов или дебага.

4️⃣ Ctrl + K, U

💡Раскомментирует все выделенные строки. Включить код обратно.

5️⃣ Ctrl + R, R

💡 Переименование переменной, метода или класса везде, где оно используется! Безопасный рефакторинг.


🔔 Подпишись, чтобы не пропустить!

👉Akrus Games | Unity
Please open Telegram to view this post
VIEW IN TELEGRAM
92😁22
главное брать не из вопроса👍
Please open Telegram to view this post
VIEW IN TELEGRAM
😁62
Unity: Sprite Mode Multiple - Разрезаем спрайт-листы!

Зачем это?
Когда импортируешь изображение со множеством спрайтов (анимации, тайлы) — выбери Multiple! Иначе весь лист считается одним большим спрайтом.

Как разрезать?
1. Выбери текстуру в Project окне.
2. В Inspector найди Texture Type -> Sprite (2D and UI).
3. Важно! Поставь Sprite Mode в Multiple.
4. Нажми Sprite Editor (откроется новое окно).

В Sprite Editor:
Авто-резка: Нажми Slice -> Выбери тип (Grid по ячейкам, Automatic по прозрачности).
Ручная резка: Выдели спрайты мышью, поправь границы.
Подтверди: Нажми Apply (в правом верхнем углу).

Готово! Теперь в Project окне разверни текстуру — увидишь все отдельные спрайты.

Зачем так делать?
• Создавать анимации из кадров.
• Использовать тайлы для построения уровней (Tilemap).
• Работать с отдельными элементами UI или объектов.

💡 Совет: Всегда проверяй Sprite Mode при импорте спрайт-листов! Одна настройка — и работа с анимациями/тайлами становится в разы проще.
#Unity #Unity2D #GameDev #Sprites #Gamedevelopment
🔥6
Media is too big
VIEW IN TELEGRAM
🔥 РОЗЫГРЫШ ИСХОДНИКА UNITY: MINECRAFT SANDBOX! 🔥
Привет геймдев-энтузиасты! 🎮 У нас горячий подарок для тех, кто хочет заглянуть под капот крутого проекта: разыгрываем полный исходник Minecraft Sandbox на Unity!

🤩 Что внутри?
🟢 Готовый sandbox

🟢Адаптивный UI в стиле Minecraft

🟢Оптимизированный код на C#

💎 Ассеты + настройки сцен

🎆 Игра полностью адаптирована под яндекс игры, подключена реклама
Ссылка

Идеально для:
🟣 Новичков в Unity (разбор рабочих механик!)
🟣 Портфолио (добавьте крутой проект!)

👑 Как выиграть:

Подписаться на Akrus Games ❤️

Нажать кнопку "Участвовать"

⚠️ Сроки:
До 20 августа 2025! Победителя выберем рандомом, результат закрепим тут.
Победитель один!

#розыгрыш #unity3d #gamedev #исходники #minecraft #кликер #AkrusGames #программирование
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥3😁1🎄111
Unity ECS & Jobs System: революция производительности

Что это?
Архитектура, где данные хранятся отдельно от логики (Data-Oriented Design). Позволяет обрабатывать десятки тысяч объектов без падения FPS.

Зачем?
- Массовые симуляции (орды врагов, частицы, песочницы)
- Полное использование многоядерных процессоров
- Предсказуемое управление памятью (Zero GC Allocations)

Базовые понятия:
- Entity — не объект, а легковесный ID.
- ComponentData — чистые данные (struct, без методов).
- System — логика, которая работает с массивами компонентов.

Пример (спавн кубов):
// Компонент (данные)
public struct RotationSpeed : IComponentData
{
public float RadiansPerSecond;
}

// Система (логика)
public class RotationSystem : SystemBase
{
protected override void OnUpdate()
{
float deltaTime = Time.DeltaTime;
Entities
.ForEach((ref Rotatable rotatable, in RotationSpeed speed) =>
{
rotatable.Value = math.mul(
math.normalize(rotatable.Value),
quaternion.AxisAngle(math.up(), speed.RadiansPerSecond * deltaTime)
);
}).ScheduleParallel();
}
}

Важно!
- Требуется пакет Entities и Unity.Burst
- Это полный разрыв с MonoBehaviour и ООП
- Идеально для VR/AR с strict performance требованиями

💡 Начинай с гибридного подхода: MonoBehaviour -> преобразование в Entity через ConvertToEntity.

#Unity #ECS #Performance #Optimization #JobSystem
🔥3
Shader Graph: создание материалов без кода

Что это?
Визуальный редактор для написания шейдеров. Собираешь нодами, как в редакторе материалов.

Зачем?
- Быстрая итерация: видишь результат в реальном времени
- Не нужно знать HLSL/GLSL на продвинутом уровне
- Создание сложных эффектов (свечение, прокрутка текстур)

Как создать эффект прокрутки текстуры:
1. Создай Texture2D ноду, подключи текстуру.
2. Создай Time ноду для анимированного параметра.
3. Создай Tiling And Offset ноду.
4. Соедини: Time -> Multiply (на скорость) -> Fraction -> в Offset порт Tiling And Offset.
5. Подключи Tiling And Offset к Base Color материала.

Сильные стороны:
- Vertex Displacement (трава, волны на воде)
- Custom Lighting Models (стилизованная графика)
- Procedural Patterns (генерируемые узоры)

Важно!
- Для мобильных платформ используй низкую точность (Half)
- Для UI шейдеров ставь Blend Mode на Alpha

💡 Комбинируй с Scriptable Render Pipeline (URP/HDRP) для полной мощности.

#Unity #ShaderGraph #Shaders #Graphics #URP
🔥8
😂
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