Forwarded from Soulshift | ALPHA
🔥 Привет, герои Emberfall!
Рады сообщить, что регистрация и авторизация в игре работают на 100%! Теперь вы можете:
- Создать аккаунт: нажмите SIGN UP, придумайте уникальный Nickname и пароль
- Войти в игру: нажмите LOGIN или отметьте «Remember me» для быстрого доступа
- Восстановить доступ: нажмите Forgot Password? и получите ссылку для сброса пароля
Готовьтесь к новому приключению: собирайте отряды героев, прокачивайте умения и побеждайте в эпических сражениях!
Подписывайтесь на канал, чтобы первыми узнать дату закрытого бета-тестирования и получить эксклюзивные бонусы.
Вперед, навстречу легендам Emberfall! ⚔️✨
Рады сообщить, что регистрация и авторизация в игре работают на 100%! Теперь вы можете:
- Создать аккаунт: нажмите SIGN UP, придумайте уникальный Nickname и пароль
- Войти в игру: нажмите LOGIN или отметьте «Remember me» для быстрого доступа
- Восстановить доступ: нажмите Forgot Password? и получите ссылку для сброса пароля
Готовьтесь к новому приключению: собирайте отряды героев, прокачивайте умения и побеждайте в эпических сражениях!
Подписывайтесь на канал, чтобы первыми узнать дату закрытого бета-тестирования и получить эксклюзивные бонусы.
Вперед, навстречу легендам Emberfall! ⚔️✨
🔥2❤1👍1
Предположим мы меняем позицию и вращение объекта, например:
IDE -шка выдаст вот такое сообщение: "Assigning position and rotation sequentially could be optimized." ("Можно оптимизировать последовательное назначение положения и поворота").
Послушаемся и применим рекомендации, получится следующее:
Такое объединение оправданно, т.к. SetPositionAndRotation() обновляет позицию и вращение за один вызов. Движок вычисляет мировые преобразования только один раз. А вот раздельные присваивания (position и rotation) приводят к двум отдельным операциям, каждая из которых вызывает пересчёт матриц преобразования, коллизий и других зависимых компонентов.
В этом случае без предъяв. Но когда вы пишите собственные методы, избегайте "и" в их названии. Если в голову приходит назвать через "And", то скорее всего это 2 разных метода и логику надо на них разделить. Например, CalculateAndShoot() - тут одна часть вообще математическая, которую иногда даже нет необходимости хранить конкретно в этом классе, а вторая отвечает за стрельбу. Или, например, PlaySoundAndAnimate() - сомнительное название. А скорее всего они вообще окажутся в разных классах и встретятся лишь в каком-нибудь методе типа OnPressJump(), который подписан на событие _input.JumpPressed += OnPressJump.
Такая вот инфа.
Интересно ли вам углубиться в код-стайл?
🔥 - да
💩 - нет
private void Update()
{
_transform.position = _position;
_transform.rotation = _quaternion;
}
IDE -шка выдаст вот такое сообщение: "Assigning position and rotation sequentially could be optimized." ("Можно оптимизировать последовательное назначение положения и поворота").
Послушаемся и применим рекомендации, получится следующее:
private void Update()
{
_transform.SetPositionAndRotation(_position, _quaternion);
}
Такое объединение оправданно, т.к. SetPositionAndRotation() обновляет позицию и вращение за один вызов. Движок вычисляет мировые преобразования только один раз. А вот раздельные присваивания (position и rotation) приводят к двум отдельным операциям, каждая из которых вызывает пересчёт матриц преобразования, коллизий и других зависимых компонентов.
В этом случае без предъяв. Но когда вы пишите собственные методы, избегайте "и" в их названии. Если в голову приходит назвать через "And", то скорее всего это 2 разных метода и логику надо на них разделить. Например, CalculateAndShoot() - тут одна часть вообще математическая, которую иногда даже нет необходимости хранить конкретно в этом классе, а вторая отвечает за стрельбу. Или, например, PlaySoundAndAnimate() - сомнительное название. А скорее всего они вообще окажутся в разных классах и встретятся лишь в каком-нибудь методе типа OnPressJump(), который подписан на событие _input.JumpPressed += OnPressJump.
Такая вот инфа.
Интересно ли вам углубиться в код-стайл?
🔥 - да
💩 - нет
🔥10
🚀 Не просто кодстайл, а философия читаемого кода в Unity
Привет, коллеги! 👋 Сегодня хочу показать вам не просто список правил, а целостный подход к написанию кода на C# в Unity, который делает его предсказуемым, читаемым и быстрым. Тут не всё, смотрите прикреплённый в комментариях файл (вообще я его составлял для того, чтобы закидывать первым же сообщением в нейросеть и на дальнейшие вопросы получать ответы уже в понятной для меня стилистике).
Вот несколько ключевых принципов, которые я использую:
1. 🤫 Инкапсуляция
Почему так? Это защита от хаоса: Никто извне не сможет изменить скорость как захочет.
Явность намерений: Поле публично только для инспектора, а не для других скриптов.
Контроль: Вся логика изменения значения находится в одном месте.
Если надо будет получить значение, то будем передавать через свойство, а изменять через метод с валидацией, например:
2. 📖 Код как техническая документация
Я избавляюсь от комментариев-костылей. Для этого вместо, например, void Proc() пишу полностью void ProcessPlayerInput().
Не "dir", а "direction", не "rb", а "rigidbody" и т.д. Вообще не стоит стремиться сокращать, буквы в коде абсолютно бесплатные )
Имя метода должно однозначно говорить о его цели, а код говорить сам за себя.
Но если ваш класс называется Health, то не надо называть поле _healthValue. Нет необходимости повторять имя класса в полях и методах. Это избыточно. Например, я обращаюсь к классу извне и получаю значение: "float переменная = _health.HealthValue;" - хуже, чем "float переменная = _health.Value;"
3. ⚡️Микро-оптимизации на уровне привычки
Обратите внимание на порядок операций:
Современное железо разницы особо не почувствует, но Visual Studio скорее всего предложит вам поменять операнды местами. Поэтому я включаю это правило в запрос нейронкам.
4. 🧠 Психология именования
Методы — это глаголы: CalculatePath(), TryGetComponent(), ShowInfo().
bool-переменные — это вопрос: isGrounded, canAttack, hasTarget.
Коллекции — во множественном числе: List<Enemy> _enemies.
А ещё следует избегать неоднозначных названий, типа Check - т.к. неясно - возвращает этот метод значение или просто проверяет внутри себя и сохраняет значение в поле. Методы, возвращающие булево значение, можно называть так же с Is, Can, Has. Возвращающие методы с Get только предоставляют инфу, а с Give – отдают данные из метода, с удалением этих данных в классе.
5. 🧼 Чистый и безопасный C#
Явная типизация: List<Vector3> points вместо var points. Читаемость важнее, чем удобство записи. Я хочу видеть тип значения, понимать, с чем работаю без дополнительных манипуляций со всплывающими подсказками.
Главный принцип: Код должен читаться как интересная техническая книга, а не как древние руны, которые нужно расшифровывать.
А что вы думаете? Какое ваше самое главное правило в кодстайле, без которого вы не можете работать? Я вообще предлагаю прям поболтать на эту тему, т.к. она куда обширнее, чем можно было бы рассказать одной публикацией. Буду ждать вас в комментариях! 👇
Привет, коллеги! 👋 Сегодня хочу показать вам не просто список правил, а целостный подход к написанию кода на C# в Unity, который делает его предсказуемым, читаемым и быстрым. Тут не всё, смотрите прикреплённый в комментариях файл (вообще я его составлял для того, чтобы закидывать первым же сообщением в нейросеть и на дальнейшие вопросы получать ответы уже в понятной для меня стилистике).
Вот несколько ключевых принципов, которые я использую:
1. 🤫 Инкапсуляция
// Вместо:
public float Speed
// Пишем:
[SerializeField] private float _speed;
Почему так? Это защита от хаоса: Никто извне не сможет изменить скорость как захочет.
Явность намерений: Поле публично только для инспектора, а не для других скриптов.
Контроль: Вся логика изменения значения находится в одном месте.
Если надо будет получить значение, то будем передавать через свойство, а изменять через метод с валидацией, например:
public float Speed => _speed;
public void SetSpeed(float value)
{
if (value < 0)
throw new ArgumentOutOfRangeException(nameof(value), "Скорость не может быть отрицательной");
_speed = value;
}
2. 📖 Код как техническая документация
Я избавляюсь от комментариев-костылей. Для этого вместо, например, void Proc() пишу полностью void ProcessPlayerInput().
Не "dir", а "direction", не "rb", а "rigidbody" и т.д. Вообще не стоит стремиться сокращать, буквы в коде абсолютно бесплатные )
Имя метода должно однозначно говорить о его цели, а код говорить сам за себя.
Но если ваш класс называется Health, то не надо называть поле _healthValue. Нет необходимости повторять имя класса в полях и методах. Это избыточно. Например, я обращаюсь к классу извне и получаю значение: "float переменная = _health.HealthValue;" - хуже, чем "float переменная = _health.Value;"
3. ⚡️Микро-оптимизации на уровне привычки
Обратите внимание на порядок операций:
// Медленнее (умножение вектора на скаляр)
transform.position += transform.forward * _speed * Time.deltaTime;
// Быстрее (умножение скаляров между собой)
transform.position += _speed * Time.deltaTime * transform.forward;
Современное железо разницы особо не почувствует, но Visual Studio скорее всего предложит вам поменять операнды местами. Поэтому я включаю это правило в запрос нейронкам.
4. 🧠 Психология именования
Методы — это глаголы: CalculatePath(), TryGetComponent(), ShowInfo().
bool-переменные — это вопрос: isGrounded, canAttack, hasTarget.
Коллекции — во множественном числе: List<Enemy> _enemies.
А ещё следует избегать неоднозначных названий, типа Check - т.к. неясно - возвращает этот метод значение или просто проверяет внутри себя и сохраняет значение в поле. Методы, возвращающие булево значение, можно называть так же с Is, Can, Has. Возвращающие методы с Get только предоставляют инфу, а с Give – отдают данные из метода, с удалением этих данных в классе.
5. 🧼 Чистый и безопасный C#
Явная типизация: List<Vector3> points вместо var points. Читаемость важнее, чем удобство записи. Я хочу видеть тип значения, понимать, с чем работаю без дополнительных манипуляций со всплывающими подсказками.
Главный принцип: Код должен читаться как интересная техническая книга, а не как древние руны, которые нужно расшифровывать.
А что вы думаете? Какое ваше самое главное правило в кодстайле, без которого вы не можете работать? Я вообще предлагаю прям поболтать на эту тему, т.к. она куда обширнее, чем можно было бы рассказать одной публикацией. Буду ждать вас в комментариях! 👇
👍6❤2🔥1
В беседе одного из чатов подняли вопрос, а насколько это тяжёлая операция - создание объекта и какое преимущество у пула.
Вот, я написал скриптик, чтобы проверить на практике.
В первом случае инстантировал и дестроил 5000 объектов. Во втором инстантировал внутри пула при необходимости и возвращал в пул.
В случае с пулом получилось почти в 6 раз эффективнее. Создавал примитив - куб.
Но я думаю, что пулы - оптимизация. Пока проект небольшой и если нет фризов, то оптимизировать нет необходимости. Может игра вообще получится неиграбельной и проект отправится на свалку, тогда зачем заранее париться за оптимизацию.
Вот, я написал скриптик, чтобы проверить на практике.
В первом случае инстантировал и дестроил 5000 объектов. Во втором инстантировал внутри пула при необходимости и возвращал в пул.
В случае с пулом получилось почти в 6 раз эффективнее. Создавал примитив - куб.
Но я думаю, что пулы - оптимизация. Пока проект небольшой и если нет фризов, то оптимизировать нет необходимости. Может игра вообще получится неиграбельной и проект отправится на свалку, тогда зачем заранее париться за оптимизацию.
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Кто играл в MiSide, наверно заметил, что там кнопка выхода слегка убегает от курсора.
Мне было интересно реализовать что-то подобное. Здесь две кнопки: одна храбрая - тянется к курсору, а вторая трусливая - пытается отталкиваться.
Я скину пакет в комментариях к этой записи, но учитывайте 3 момента:
1. Я позволил себе наговнокодить, т.к. знал, что менторам на проверку скидывать не придётся.
2. Это выдернуто прям из проекта и поэтому добавил заглушки, где раньше была связь с другими классами
3. TextMeshPro - эта штука в консоль выбрасывает ошибки. Их можно проигнорить, запустить демо-сцену и в PlayMode всё начнёт работать, но в идеале удалить объекты с компонентами TextMeshPro в сцене и создать заново.
Мне было интересно реализовать что-то подобное. Здесь две кнопки: одна храбрая - тянется к курсору, а вторая трусливая - пытается отталкиваться.
Я скину пакет в комментариях к этой записи, но учитывайте 3 момента:
1. Я позволил себе наговнокодить, т.к. знал, что менторам на проверку скидывать не придётся.
2. Это выдернуто прям из проекта и поэтому добавил заглушки, где раньше была связь с другими классами
3. TextMeshPro - эта штука в консоль выбрасывает ошибки. Их можно проигнорить, запустить демо-сцену и в PlayMode всё начнёт работать, но в идеале удалить объекты с компонентами TextMeshPro в сцене и создать заново.
👍3🔥3
Media is too big
VIEW IN TELEGRAM
Все сцены в отдельном окне
Идея не нова: многие разработчики так делают, чтобы не блуждать по иерархии проекта в поисках сцены, на которую надо переключиться. Я тоже не люблю покидать папку скриптов или префабов без особой необходимости.
Поэтому мной подготовлен собственный ассет для этих целей. Он состоит из одного скрипта на 180 строк.
В окне есть 2 списка: "Избранное" - где все основные сцены, с которыми вы работаете и "Остальные сцены" - это обычно демки с различных ассетов.
При нажатии на сцену происходит переход. При наведении на папку - вы видите путь к сцене в проекте. При нажатии на папку вы подсвечиваете сцену в проекте.
Ассет прикреплю в первом комментарии к записи.
На этом пока всё, до новых встреч 🙂
Проголосуйте:
👍 - если полезно
👎 - если бесполезно
Идея не нова: многие разработчики так делают, чтобы не блуждать по иерархии проекта в поисках сцены, на которую надо переключиться. Я тоже не люблю покидать папку скриптов или префабов без особой необходимости.
Поэтому мной подготовлен собственный ассет для этих целей. Он состоит из одного скрипта на 180 строк.
В окне есть 2 списка: "Избранное" - где все основные сцены, с которыми вы работаете и "Остальные сцены" - это обычно демки с различных ассетов.
При нажатии на сцену происходит переход. При наведении на папку - вы видите путь к сцене в проекте. При нажатии на папку вы подсвечиваете сцену в проекте.
Ассет прикреплю в первом комментарии к записи.
На этом пока всё, до новых встреч 🙂
Проголосуйте:
👍 - если полезно
👎 - если бесполезно
👍11
Переписка с другом, который мне как брат. Я действительно хорошо себя чувствую в кинологии и могу зашибать от 140к в месяц на дрессуре. В этом направлении так же нет потолка и я в этой профессии уже 18 лет.
Но! Я не из тех, кто ищет благоприятную нишу. Готов лбом пробивать стены, чтобы заниматься тем, что интересно в данный момент. Я искренне считаю, что нет смысла искать прибыльную профессию, которая не будет приносить вам кайф.
Лет 10 назад все думали, что технологии вытеснят все профессии, не требующие творческой и умственной деятельности. А теперь что? Нейронки пишут музыку, генерируют изображения, 3д модели, рассуждают и познают наш мир. И лишь дворник стабильно делает своё дело без страха (пока), что подметать перед домом будет робот.
Всё так стремительно меняется, что не очень понятно, как будут обстоять дела через 5 лет. Так что моё решение даже слегка обоснованно.
Хотите, я расскажу, как ИИ может заменить кинологов и дрессировщиков собак уже сегодня?
👍 - да
👎 - нет
Но! Я не из тех, кто ищет благоприятную нишу. Готов лбом пробивать стены, чтобы заниматься тем, что интересно в данный момент. Я искренне считаю, что нет смысла искать прибыльную профессию, которая не будет приносить вам кайф.
Лет 10 назад все думали, что технологии вытеснят все профессии, не требующие творческой и умственной деятельности. А теперь что? Нейронки пишут музыку, генерируют изображения, 3д модели, рассуждают и познают наш мир. И лишь дворник стабильно делает своё дело без страха (пока), что подметать перед домом будет робот.
Всё так стремительно меняется, что не очень понятно, как будут обстоять дела через 5 лет. Так что моё решение даже слегка обоснованно.
Хотите, я расскажу, как ИИ может заменить кинологов и дрессировщиков собак уже сегодня?
👍 - да
👎 - нет
👍10
Media is too big
VIEW IN TELEGRAM
Как заменить кинолога нейросетями
Есть такие собачьи видеоняни, они:
- передают видео и звук на смартфон;
- имеют колонки, чтобы говорить что-то собаке через смартфон;
- по нажатию на кнопку телефона выкидывают корм для поощрения собаки.
Всё. Этого достаточно, чтобы подрубить ИИ, который будет подавать сигнал о правильном действии собаки и подкреплять её решение лакомством.
Вот так уходишь на работу, а нейросетка развлекает собаку: хвалит за нахождение в лежаке, учит командам и трюкам. Это возможно уже сейчас, просто никто не реализовал (пока что).
На видео я при помощи щелчков кликера и лакомства приучаю собаку открывать клетку, заходить и закрываться внутри. Ничего принципиально не изменится, если вместо меня это будет делать нейросеть. И это хорошо! Это сделает жизнь собачников комфортнее, а сами собаки не будут скучать ежедневно по 8 часов одни дома.
Есть такие собачьи видеоняни, они:
- передают видео и звук на смартфон;
- имеют колонки, чтобы говорить что-то собаке через смартфон;
- по нажатию на кнопку телефона выкидывают корм для поощрения собаки.
Всё. Этого достаточно, чтобы подрубить ИИ, который будет подавать сигнал о правильном действии собаки и подкреплять её решение лакомством.
Вот так уходишь на работу, а нейросетка развлекает собаку: хвалит за нахождение в лежаке, учит командам и трюкам. Это возможно уже сейчас, просто никто не реализовал (пока что).
На видео я при помощи щелчков кликера и лакомства приучаю собаку открывать клетку, заходить и закрываться внутри. Ничего принципиально не изменится, если вместо меня это будет делать нейросеть. И это хорошо! Это сделает жизнь собачников комфортнее, а сами собаки не будут скучать ежедневно по 8 часов одни дома.
❤2🤔1
Forwarded from Роман Сакутин
Джуниоров, мидлов и сеньёров не существует
У меня уже глаз дёргается.
Каждый раз на конференции если есть доклад как стать: “Художником\Программистом\Баристом”
Обязательно пол презентации закручивают в уши одно и тоже: “Ну есть джуны, они попроще, есть сеньёры, они покруче. Ваша зарплата зависит от вашего опыта и кто вы”
Так и хочется крикнуть (что я и делаю): “А если я феечка винкс блин, блум например, мне сколько денег заплатят?”
Это тааакааая абстрактная условность, что относится к этому серьёзно, как относится серьёзно к званиям в детской игре.
Вот собралась толпа шестилеток и играют в королевство. Кто-то король, кто-то маг придворный, кто-то холоп. Разыгрывают сценки.
Групповая галлюцинация да и только.
Поверьте, если вы будете всем ходить и говорить что вы сеньёр то вас никто и никогда не разоблачит.
У меня уже глаз дёргается.
Каждый раз на конференции если есть доклад как стать: “Художником\Программистом\Баристом”
Обязательно пол презентации закручивают в уши одно и тоже: “Ну есть джуны, они попроще, есть сеньёры, они покруче. Ваша зарплата зависит от вашего опыта и кто вы”
Так и хочется крикнуть (что я и делаю): “А если я феечка винкс блин, блум например, мне сколько денег заплатят?”
Это тааакааая абстрактная условность, что относится к этому серьёзно, как относится серьёзно к званиям в детской игре.
Вот собралась толпа шестилеток и играют в королевство. Кто-то король, кто-то маг придворный, кто-то холоп. Разыгрывают сценки.
Групповая галлюцинация да и только.
Поверьте, если вы будете всем ходить и говорить что вы сеньёр то вас никто и никогда не разоблачит.
Media is too big
VIEW IN TELEGRAM
Реф, по которому буду пилить первый проект пыточной. Меня пощадили с задачей (у остальных всё ИМХО сложнее). Дизайн можно менять, но не сильно отходить от исходных механик.
Пока ставится версия юньки, в которой надо работать, я прикидываю, что и как буду делать.
Очевидно проект 2D. По сути, это гибрид двух игр: zuma-подобной и головоломки с авто на парковке, которые мешают друг другу выехать.
Сразу же тут напрашивается применение сплайнов - кривых, вдоль которых будет уверенно топать толпа. Ещё я подумываю впихнуть все уровни в одну сцену. Ну, держать префабы с заранее выставленными на парковке тачками в ресурсах и подтягивать оттуда. Так же и с маршрутами. А данные о количестве цветов подтягивать из констант согласно выбранного уровня. Ну, мне так кажется.
Такую игруху можно зафигачить быстро, но если красиво оформлять, подключать плагин, следить за чистотой кода, то для моего уровня разработки где-то месяца 1,5-2. И увеличим это время на всякий случай раз так в 5 )
Пока ставится версия юньки, в которой надо работать, я прикидываю, что и как буду делать.
Очевидно проект 2D. По сути, это гибрид двух игр: zuma-подобной и головоломки с авто на парковке, которые мешают друг другу выехать.
Сразу же тут напрашивается применение сплайнов - кривых, вдоль которых будет уверенно топать толпа. Ещё я подумываю впихнуть все уровни в одну сцену. Ну, держать префабы с заранее выставленными на парковке тачками в ресурсах и подтягивать оттуда. Так же и с маршрутами. А данные о количестве цветов подтягивать из констант согласно выбранного уровня. Ну, мне так кажется.
Такую игруху можно зафигачить быстро, но если красиво оформлять, подключать плагин, следить за чистотой кода, то для моего уровня разработки где-то месяца 1,5-2. И увеличим это время на всякий случай раз так в 5 )
🔥6😁1🤯1
Media is too big
VIEW IN TELEGRAM
Решил начать с самого вкусного в задании
Во-первых, я понял, почему в рефе шейдер с обводкой: на поворотах надо менять порядок смайликов и это без шейдера смотрится коряво.
Во-вторых, я подумываю вместо смайлов сделать фрукты. И название Angry Fruits очень подходит, и разнообразие будет вплоть до экзотических фруктов.
В-третьих, сделал пул, но пока он не выполняет свою функцию, т.к. в последовательности пока ещё нет повторений и сейчас нечем атаковать, чтобы вернуть в пул.
В-четвёртых, уже надо немного рефакторить. Я зачем-то сделал расширенную настройку по количеству линий врагов, боевому порядку, отступу друг от друга. А с другой стороны, пусть пока будет.
Во-первых, я понял, почему в рефе шейдер с обводкой: на поворотах надо менять порядок смайликов и это без шейдера смотрится коряво.
Во-вторых, я подумываю вместо смайлов сделать фрукты. И название Angry Fruits очень подходит, и разнообразие будет вплоть до экзотических фруктов.
В-третьих, сделал пул, но пока он не выполняет свою функцию, т.к. в последовательности пока ещё нет повторений и сейчас нечем атаковать, чтобы вернуть в пул.
В-четвёртых, уже надо немного рефакторить. Я зачем-то сделал расширенную настройку по количеству линий врагов, боевому порядку, отступу друг от друга. А с другой стороны, пусть пока будет.
❤4👍4🔥3
Всем привет! Сейчас в пути, а значит по традиции без фото и видео.
Выше уже есть видео со спавном врагов. Теперь я сделал более гибкую систему настройки. Теперь можно включить флаг, который будет запускать разные типы врагов в случайной последовательности, что подойдёт для обычных уровней. Цвета тоже задаются случайным образом, но чтобы не плодить кучу префабов врагов, авто и пушек, пришлось кардинально пересмотреть логику.
Мне надо сделать врагов в 3d, перекрашивать материал, а поверх накладывать текстуру злых лиц. Так я впервые сделал свой кастомный шейдер.
Вот ещё какие мысли сейчас кручу в голове: количество врагов на уровне должно совпадать с количеством боеприпасов (в разных размерах авто их разное количество). А значит надо будет в редакторе юнити сделать класс, который будет брать уровень, считать врагов по каждому типу, затем брать авто и считать боеприпасы. Если в каком-то уровне будет их несоответствие, выводить в консоль, чего и сколько не хватает.
Ну и при построении уровня я хочу визуализировать, какие типы авто где стоят, поэтому будет кнопка, которая рандомно их перекрасит.
Наверно это сложно читать, но на самом деле пока всё просто, было бы время это делать )
Выше уже есть видео со спавном врагов. Теперь я сделал более гибкую систему настройки. Теперь можно включить флаг, который будет запускать разные типы врагов в случайной последовательности, что подойдёт для обычных уровней. Цвета тоже задаются случайным образом, но чтобы не плодить кучу префабов врагов, авто и пушек, пришлось кардинально пересмотреть логику.
Мне надо сделать врагов в 3d, перекрашивать материал, а поверх накладывать текстуру злых лиц. Так я впервые сделал свой кастомный шейдер.
Вот ещё какие мысли сейчас кручу в голове: количество врагов на уровне должно совпадать с количеством боеприпасов (в разных размерах авто их разное количество). А значит надо будет в редакторе юнити сделать класс, который будет брать уровень, считать врагов по каждому типу, затем брать авто и считать боеприпасы. Если в каком-то уровне будет их несоответствие, выводить в консоль, чего и сколько не хватает.
Ну и при построении уровня я хочу визуализировать, какие типы авто где стоят, поэтому будет кнопка, которая рандомно их перекрасит.
Наверно это сложно читать, но на самом деле пока всё просто, было бы время это делать )
🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
А вот и шейдер. Цвет материала настраивается отдельно, текстура отдельно 😎
Шейдер выглядит так:
Шейдер выглядит так:
Shader "Custom/AlphaChannelMask" {
Properties {
_MainTex ("Texture (RGB) + Mask (A)", 2D) = "white" {}
_BackgroundColor ("Background Color", Color) = (0,0,1,1)
}
SubShader {
Tags { "RenderType"="Opaque" }
CGPROGRAM
#pragma surface surf Standard
sampler2D _MainTex;
fixed4 _BackgroundColor;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutputStandard o) {
fixed4 texData = tex2D(_MainTex, IN.uv_MainTex);
fixed3 color = texData.rgb;
fixed mask = texData.a;
o.Albedo = lerp(_BackgroundColor.rgb, color, mask);
o.Alpha = 1.0;
}
ENDCG
}
}🔥5❤2
This media is not supported in your browser
VIEW IN TELEGRAM
Всем привет! Уже немного сделано. Дальше в планах:
1. Подумываю сделать запуск автомобилей свайпом.
2. Надо сделать, чтобы враги откатывались, когда в середине образуется пустота (это самое интересная и единственная непродуманная мной задача на данный момент).
3. Анимации стрельбы, езды и партиклы попаданий. Подозреваю, это преобразит игру.
А ещё я сделал одну штуку, которая поможет мне не накосячить при создании кучи уровней. Продемонстрирую, когда начну собирать уровни 🙂
1. Подумываю сделать запуск автомобилей свайпом.
2. Надо сделать, чтобы враги откатывались, когда в середине образуется пустота (это самое интересная и единственная непродуманная мной задача на данный момент).
3. Анимации стрельбы, езды и партиклы попаданий. Подозреваю, это преобразит игру.
А ещё я сделал одну штуку, которая поможет мне не накосячить при создании кучи уровней. Продемонстрирую, когда начну собирать уровни 🙂
🔥5
This media is not supported in your browser
VIEW IN TELEGRAM
Хватит с меня кодинга на сегодня. Половину дня придумывал систему для отката врагов вверх по сплайну, уже доходило до 280 строк запутанного кода. И что в итоге? Снёс всё нафиг, при спавне стал записывать расстояние от нового врага до старого и тупо откатывать, если это расстояние изменилось, когда часть врагов уничтожена и удалена из списка. Получилось пока рвано и под вечер поймал ещё один баг. Но думаю, завтра исправлю это. Уже не терпится перейти к свайпу авто. Там тоже будет не всё так радужно, конечно, ведь это свайпы, резервирование мест, проверка, что нет препятствий, маршрут в объезд в сторону слотов для пушек и вообще к конкретному слоту. Короче, будет полная жо весело.
🔥7