Готова ли Игра?
249 subscribers
123 photos
20 videos
9 files
31 links
Научу делать игры ПРАВИЛЬНО!

Для связи со мной: @ArtemiZ_GD
Download Telegram
Как я докатился до жизни такой часть 3

Начало истории

Естественно, с таким багажом никто брать не хотел.

В феврале я все таки нашел вакансию на ХедХантере, где я прошел собеседование и начал работать. Но было один подвох - 20к в месяц. За такие деньги в Питере хватит максимум на еду. А руководство требовало делать невыполнимые задачи.

Как вы поняли, долго я там не задержался. Через неделю уже уволился, даже не рассчитали...

Пошел дальше на hh.ru. Около недели я откликался и неожиданно меня пригласили на ПК проект в стим, еще и с очень интересной идеей!
Прошел собеседование, ответил на вопросы, и дал оценку по времени выполнения проекта - 3 месяца. Это было максимально сжатые сроки, за которые я скорее всего успел.

Но и тут оказался небольшой подвох! Меня попросили сжать сроки еще больше! Мол, 3 месяца для такого проекта слишком много... Естественно, когда ты устраиваешься на первую работу, ты готов демпинговать, лишь бы взяли. Пришлось сказать 1,5 месяца.

В итоге: за первый месяц - я не успел практически ничего. Прошло 2 месяца - я сделал меньше половины, но менеджер сказал, что дает мне еще времени. Прошло 3 месяца - я все еще делал проект...

Если вы думали, что все так просто - не переживайте, все еще впереди! Жду комментарии от вас, если хотите узнать финал истории)

Продолжение

#ЖизньArtemiZ
🚀 Как правильно использовать Update() и не убить производительность

Привет, геймдев! Сегодня разберём самую частую ошибку джунов - неправильное использование Update().

⚡️ Почему это важно?
Update() вызывается КАЖДЫЙ КАДР для КАЖДОГО активного скрипта. На 100 объектах при 60 FPS это уже 6000 вызовов в секунду!

🛠 Три золотых правила оптимизации Update():

1. Кэшируйте компоненты:// Плохо 
void Update() {
GetComponent<Rigidbody>().velocity = Vector3.up;
}

// Хорошо
Rigidbody rb;
void Start() {
rb = GetComponent<Rigidbody>();
}
void Update() {
rb.velocity = Vector3.up;
}


2. Избегайте Find и GetComponent в Update:// Очень плохо

void Update() {
GameObject.Find("Player").transform.position;
}


3. Используйте правильные события:
- FixedUpdate() - для физики
- LateUpdate() - для камеры
- Update() - для инпута и геймплея

💡 Лайфхак: Для редких проверок используйте корутины:// Вместо проверки каждый кадр
IEnumerator CheckEverySecond() {
while (true) {
CheckSomething();
yield return new WaitForSeconds(1f);
}
}

🎯 Результат:
- Стабильный FPS
- Меньше нагрузка на CPU
- Счастливые игроки

#Фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
Жду новые вопросы под этим постом! В следующую пятницу отвечу на один из них)

Если вы стесняетесь написать лично, можете оставить анонимный вопрос через специального бота
Усердно готовлюсь к выпуску первого ролика! Техническая часть уже готова - осталось написать сценарий и записать все это)

Сроков никаких не даю, хочу сделать все максимально качественно и интересно:)

Немного контекста: как то давно я вел свой ютуб канал, набрал практически 1000 подписчиков и бросил. Сейчас хочу возобновиться с новым опытом и знаниями!)
Мы продолжаем работу над авто-чесом. Недавно утвердили концепт первой локации, пробуем делать подобную локацию. А в это время я все еще сражаюсь с трудностями мультиплеера.

На прошлом созвоне мы постестили билд, но не без проблем. Минут 30 мы пытались запуститься в одно лобби)))

Однако, несмотря на все страдания, этот билд оказался первым, который не вылетал, не крашился, все работало!!!

Да, были некоторые баги, но это не столь важно. Мы наконец-то перешли на этап фикса визуальных багов, а не геймплейных и логических.

В общем, постепенно продвигаемся))

#Спойлер
Как я докатился до жизни такой часть 4

Начало истории

Ах да, я же вам не рассказал еще одну деталь. Во время заключения договора на разработки игры я указывал срок работы и оплату после окончания проекта. Да - оплата была проектная, а значит чем дольше я его делал, тем меньше в месяц я бы получил. А указал я в договоре не сильно большую сумму, а за 3 месяця я скатился до уровня первой работы и даже ниже. В общем, все было ужасно, еще и сроки поджимали...

Внезапно мне предлагают пройти собеседование в зарубежный стартап. К слову, на протяжении всего времени я периодически откликался на различные вакансии. Но тут было что-то странное, мне предложили работу за рубежом с окладом в 10 раз больше!

Я думаю, вы не сомневаетесь, что я сделал: написал своему работодателю, что увольняюсь... Если бы все было так просто...

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

В общем, я заплатил неустойку и, уже больше полгода, работаю в великолепном коллективе из 5 человек, с великолепными условиями. Я уже получил огромный опыт, и сейчас я могу смело назвать себя хорошим разработчиком, а не просто кодером, который только начинает изучать сферу)

#ЖизньArtemiZ
Режим, планы, все это конечно важно. Но когда приходит вдохновение, я предпочитаю делать до конца:)
🎮 Как оптимизировать физику и перестать терять FPS

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

🔥 Главная ошибка: использование слишком сложных коллайдеров

Вот что нужно знать:
// Скорость расчётов (от быстрого к медленному):
1. Sphere Collider
2. Box Collider
3. Capsule Collider
4. Mesh Collider (convex)
5. Mesh Collider (non-convex) 💀


⚡️ Золотое правило: используйте составные примитивы вместо Mesh Collider

// Плохо 
- Один сложный Mesh Collider для всего персонажа

// Хорошо
- Capsule Collider для тела
- Box Collider для оружия
- Sphere Collider для головы


🛠 Три быстрых способа оптимизировать физику:

1. Используйте слои столкновений:
// В Physics Settings настройте матрицу
// чтобы враги не проверяли столкновения друг с другом

[SerializeField] private LayerMask _enemyLayer;

private void OnCollisionEnter(Collision other)
{
if (other.gameObject.layer == _enemyLayer)
{
// Do something
}
}


2. Отключайте Rigidbody когда можно:
_rb.isKinematic = true; // для неподвижных объектов


3. Используйте физические материалы с правильными настройками трения:
// Для скользких поверхностей
_physicMaterial.friction = 0;
_physicMaterial.bounciness = 0;


💡 Профи-совет:
Включите Wireframe mode в Scene View (Shading mode -> Wireframe), выделите все объекты и проверьте, нет ли лишних коллайдеров.

🎯 Результат: Стабильный FPS даже при большом количестве объектов

#Фишки
Please open Telegram to view this post
VIEW IN TELEGRAM
Жду новые вопросы под этим постом! В следующую пятницу отвечу на один из них)

Если вы стесняетесь написать лично, можете оставить анонимный вопрос через специального бота
Я просто решил посмотреть, как устроен метод внутри, а тут такое...

У меня одного возникает вопрос, что здесь происходит?) Почему тут 22 переменные с именами num, num2 и тд
Я просто хотел, чтобы он мне помог...

Пишу GigaChat-у, чтобы он написал скрипт для его подключения. В итоге он написал скрипт для подключения ChatGPT.

Не ЧСВ
Если хотите, могу скинуть исходники (как подключиться и использовать GigaChat).

P.S. Если что, нигде нет инфы как подключиться именно к Unity.
P.P.S. Если спросите, почему именно GigaChat а не что то другое, отвечаю: единственная нейронка, у которой есть бесплатные токены + она официально доступна для РФ (это очень важно для меня, так как я хочу с ее использованием податься на конкурс)
GigaChat.unitypackage
4.7 KB
Все, что вам нужно сделать, зарегаться на сайте и получить ключ авторизации (вставить его в ScriptableObject). Теперь на сцене выбираем камеру, на ней весит скрипт, куда нужно вводить запрос и все!
Фрэймворки переоценены

В последнее время меня часто спрашивают, пользуюсь ли я какими-то фреймворкими, и меня возникает вопрос, почему вокруг них такой хайп?

Лично я не пользуюсь практически ничем. Единственное, сейчас делаем мультиплеер, следовательно изучил Photon. Но в остальном, я считаю, что они практически бесполезны…

Не торопитесь кидаться тапками, есть пару но!

В каких случаях сторонние ресурсы бесполезны:

1. Вы новичок!

Если у вас нет базы, вы не понимаете как составляется архитектура базовых приложений и не уверены в языке, на котором пишете: фреймворки вам не помогут

2. Вы делаете типичный проект:

Фреймворки, как правило, решают специфические проблемы, которые вы не встретите в 50% проектов.

В каких случаях они нужны:

1. Если вам нужно решить специфическую задачу (мультиплеер, сторонный сервер, нейронка и тд)

2. Вы много лет работаете, на 100% уверены в том, что пишете и вам хочется развиваться.

В остальных случаях я не советую из использовать. Почему?

Неопытный программист может не просто не получить никакой пользы, а еще и привыкнуть к неправильным практикам и загубить себе несколько лет работы.

В Unity встроено достаточно функций, чтобы реализовать практически все, что угодно. И лучше сделать это самому, чем использовать сторонний код. Так вы будете быстрее развиваться и углублять знания.

#Мнение
🎮Чистый код в Unity для начинающих

Привет! Сегодня поговорим об основах архитектуры кода в Unity. Это то, что отличает начинающего разработчика от профессионала.

📝 Основные принципы чистого кода:

1. Правильное именование
//  Плохо
public class plController : MonoBehaviour
{
private float spd = 5f;
public void mv() { }
}

// Хорошо
public class PlayerController : MonoBehaviour
{
private float _moveSpeed = 5f;

public void Move() { }
}


2. Один скрипт - одна задача
//  Плохо
public class Player : MonoBehaviour
{
public void Move() { }
public void Attack() { }
public void UpdateUI() { }
public void SaveGame() { }
}

// Хорошо
public class PlayerMovement : MonoBehaviour
{
[SerializeField] private float _moveSpeed = 5f;

private Rigidbody2D _rb;

private void Awake()
{
_rb = GetComponent<Rigidbody2D>();
}

public void Move(Vector2 direction)
{
_rb.velocity = direction * _moveSpeed;
}
}


3. Кэширование компонентов
//  Плохо
private void Update()
{
GetComponent<Rigidbody2D>().velocity = Vector2.right;
}

// Хорошо
private Rigidbody2D _rb;

private void Awake()
{
_rb = GetComponent<Rigidbody2D>();
}

private void FixedUpdate()
{
_rb.velocity = Vector2.right;
}


💡 Полезные советы:

- Используйте [SerializeField] вместо public для инспектора
- Группируйте похожие переменные
- Добавляйте XML-комментарии к публичным методам
/// <summary>
/// Наносит урон игроку.
/// </summary>
/// <param name="damage">Количество урона.</param>
/// <returns>Оставшееся здоровье.</returns>
public float TakeDamage(float damage)
{
_currentHealth -= damage;
return _currentHealth;
}


🎯 Простой пример правильной структуры:
public class PlayerHealth : MonoBehaviour
{
[SerializeField] private float _maxHealth = 100f;

private float _currentHealth;

public event System.Action<float> OnHealthChanged;

private void Awake()
{
_currentHealth = _maxHealth;
}

public void TakeDamage(float damage)
{
_currentHealth = Mathf.Max(0f, _currentHealth - damage);
OnHealthChanged?.Invoke(_currentHealth);
}

public void Heal(float amount)
{
_currentHealth = Mathf.Min(_maxHealth, _currentHealth + amount);
OnHealthChanged?.Invoke(_currentHealth);
}
}


📚 Что изучать дальше:
- SOLID принципы
- Паттерны проектирования
- Dependency Injection
- Событийно-ориентированная архитектура

⚡️ Совет: Начните применять эти принципы в маленьких проектах. Со временем чистый код войдет в привычку.

#Фишки
Странная ситуация получается, вроде и опыта у меня много и над проектами крупными работал, а ни одной игры в сторе нет…

Надо бы исправлять это)

Как вы относитесь к ритм играм?)