Unity & Unreal | GameDev
36K subscribers
2.99K photos
396 videos
2.15K links
Все для разработчиков игр на Unity и Unreal.
Неофициальное сообщество.

По всем вопросам: @kesh_keshh и @dimaa_dimaa

Ссылка на канал: https://t.me/+XfyJa-jxN343NWZi

РКН: https://vk.cc/cHWH1j

Биржа: https://telega.in/channels/unity_gamedev_unreal/card
Download Telegram
Полезный приём для Unity: используйте ScriptableObject как централизованное хранилище данных

Хотите снизить связность между компонентами, упростить балансировку и быстро менять параметры в нескольких сценах? ScriptableObject — простой и мощный инструмент для этого.

- Разделяет данные и поведение: настройки хранятся отдельно от MonoBehaviour.
- Лёгкое переиспользование: один ассет — множество объектов/сцен.
- Быстрая балансировка: правите значение в инспекторе — все ссылки обновляются.
- Меньше дублирования префабов: данные не копируются в каждый префаб.
- Хорошо сочетается с Addressables для динамической подгрузки данных.

Пример простого ScriptableObject для оружия:
using UnityEngine;

[CreateAssetMenu(fileName = "WeaponData", menuName = "Game/Data/Weapon")]
public class WeaponData : ScriptableObject {
public string weaponName;
public int damage;
public float cooldown;
}


Как использовать в компоненте:
using UnityEngine;

public class Weapon : MonoBehaviour {
public WeaponData data;

void Attack() {
Debug.Log($"Attack {data.weaponName} dmg={data.damage}");
// Реализуйте логику с использованием data.cooldown и т.д.
}
}


Короткие советы:
- Если нужно менять данные только во время игры (и не сохранять изменения в ассете), создавайте копию через ScriptableObject.CreateInstance<T>().
- Для сложных наборов конфигураций используйте ScriptableObject-массивы или контейнеры (GameSettings).
- Если планируете подгружать данные динамически — храните ScriptableObject в Addressables.

#Unity
#Полезное
8
Полезные привычки для Unity-разработчика

Небольшие практики, которые сэкономят время и упростят поддержку проекта.

- Организуйте проект с самого начала: папки для Scenes, Prefabs, Scripts, Art, Materials. Придерживайтесь единого нейминга.
- Делайте префабы и используйте Prefab Variants вместо копирования объектов вручную.
- Храните конфигурации в ScriptableObject — меньше связности между компонентами, проще балансировать.
- Внедрите простой object pooling для частых Instantiate/Destroy (особенно для пуль, врагов, эффектов).
- Используйте Addressables/Async для загрузки больших ассетов и сцен без фризов.
- Подключите Profiler и проверяйте билд на целевом устройстве рано и часто.
- Автоматизируйте сборки (CI) и тесты — экономит часы при частых релизах.

Короткий пример простого пула:
public class SimplePool : MonoBehaviour {
public GameObject prefab;
Queue<GameObject> q = new Queue<GameObject>();
public GameObject Get() {
if(q.Count == 0) q.Enqueue(Instantiate(prefab));
var obj = q.Dequeue();
obj.SetActive(true);
return obj;
}
public void Release(GameObject obj) {
obj.SetActive(false);
q.Enqueue(obj);
}
}


#Unity
#Полезное
👍163
ScriptableObject Event Channels — простой способ связать системы в Unity без жёстких зависимостей

Коротко: если нужно отправлять события между разными системами (UI, геймплей, звук) и не хочется втыкать ссылки между объектами — используйте каналы на основе ScriptableObject.

- Что это: ScriptableObject, который выступает как "канал" для события. Отправители вызывают метод Raise(), подписчики реагируют через UnityEvent или делегаты.
- Зачем: уменьшает связность, упрощает тестирование и повторное использование логики между сценами и префабами.
- Когда не использовать: если нужна мгновенная жёсткая зависимость или очень частые события (миллисекунды) — там обычные делегаты/системы ECS могут быть эффективнее.

Пример простого GameEvent:
using UnityEngine;
using UnityEngine.Events;

[CreateAssetMenu(fileName = "GameEvent", menuName = "Events/GameEvent")]
public class GameEvent : ScriptableObject {
public UnityEvent listeners;

public void Raise() {
listeners?.Invoke();
}
}


Пример объекта-отправителя:
using UnityEngine;

public class EventRaiser : MonoBehaviour {
public GameEvent gameEvent;

void SomeAction() {
gameEvent?.Raise();
}
}


Пример слушателя:
using UnityEngine;
using UnityEngine.Events;

public class EventListener : MonoBehaviour {
public GameEvent gameEvent;
public UnityEvent response;

void OnEnable() {
if (gameEvent != null) gameEvent.listeners.AddListener(OnEventRaised);
}
void OnDisable() {
if (gameEvent != null) gameEvent.listeners.RemoveListener(OnEventRaised);
}
void OnEventRaised() => response?.Invoke();
}


Полезные советы:
- Отписывайтесь в OnDisable/OnDestroy, чтобы избежать утечек или вызовов на удалённых объектах.
- Для передачи данных используйте generic GameEvent<T> или создавайте отдельные SO с параметром.
- Храните каналы в папке Assets/Events и используйте CreateAssetMenu для быстрого создания.
- Если нужно сериализуемое логирование событий — добавьте историю внутри SO (с осторожностью по памяти).

Подробнее по ScriptableObject: Unity Manual

#Unity
13👍1🔥1
Быстрая проверка оптимизации Unity — что сделать в первую очередь

Коротко: пять простых шагов, которые часто дают заметный прирост производительности.

- Static Batching — пометь неподвижные объекты как Static, чтобы уменьшить количество draw calls.
- Occlusion Culling — включи для больших сцен, чтобы не рисовать невидимые объекты.
- Object Pooling — избегай частых Instantiate/Destroy, особенно для пулов врагов и эффектов.
- Addressables — загружай/выгружай ассеты по требованию, чтобы снизить использование памяти.
- Profiler — анализируй CPU/GPU/Memory; используй Deep Profile только для узких мест.

#Unity
🤣6👍31🔥1
Unity Game Dev — чтож делать чтож делать?

Коротко: первые шаги, которые помогут быстро начать и не запутаться.

- Установи Unity Hub и выбери LTS‑версию. LTS стабильнее для проектов.
- Создай/входи в Unity ID — синхронизация, лицензии и доступ к Asset Store/Cloud.
- Новый проект — выбери шаблон: 2D, 3D, URP или HDRP в зависимости от цели.
- Освоиться с интерфейсом: открой панели Scene, Game, Hierarchy, Inspector, Project. Попробуй play/pause.  

- Установи нужные пакеты: через  → Package Manager добавь Cinemachine, Input System, Addressables и рендер‑пакет по необходимости.  

- Импортируй примеры и ассеты — несколько готовых сцен помогут понять рабочий процесс.
- Настрой версионный контроль: Git + корректный .gitignore для Unity (важно с самого начала).
- Проверь Build Settings: выбери платформу (PC/Mobile/Web) и протестируй сборку.  → Build Settings.  

- Смотри туториалы: начни с официальных уроков — Unity Learn и документации: Unity Documentation.
- Регулярно сохраняй и делай бекапы. Экспортируй проект в облако или делай архивацию.

Совет: начни с маленького прототипа (1–2 механики), доведи до рабочей версии — это лучше, чем большой незаконченный проект.

#Unity
🤣10👍74
Проект на LTS

Почему LTS?

Выбирай LTS через Unity Hub и фиксируй версию в документации.

Перед апгрейдом делай бэкап и отдельную ветку в Git, тестируй пакеты и билды на копии проекта — откат должен быть простым и проверенным.

#Полезное
#Unity
1
Структура папок

Организация важнее скорости
Assets/Art/Audio/Scripts/Scenes/Prefabs/Materials. Используй префиксы (UI, CHR) и asmdef для модульности. README в корне поможет новым разработчикам быстро влиться.

#Unity
#Полезное
3🔥1
Git и .gitignore

Настрой версионирование правильно
Добавь в .gitignore Library, Temp, obj и билды.

Коммить сцены небольшими логическими правками, описывай PR, храните manifest.json в репо, чтобы зафиксировать версии пакетов.

#Unity
#Полезное
3🤣1