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

Для связи со мной: @ArtemiZ_GD
Download 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
- Событийно-ориентированная архитектура

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

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

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

Как вы относитесь к ритм играм?)
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
За пару дней сделал вот такой вот детектор битов. Работает не идеально, нужно настраивать чувствительность и другие параметры. Но все же, меня устраивает)
Audio
А еще, я для этой игры буду генерировать музыку с помощью нейронки. Сейчас сижу, пробую и знаете что?

Уже десятые раз переслушиваю одну песню... Никогда не верил в то, что нейронка сможет такое сделать, но это случилось)

На слова не обращайте внимания)
Мы потратили неделю на настройку освещения нашей локации

2-3 дня я потратил на то, чтобы понять, как можно сохранить запеченый свет в префаб)

В итоге нашел решение, которое работает:)
Что мы делаем в час ночи?

Едим пасту-бургер (необычный рецепт:)