Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public class Rocket : PlayerRocketBaseprotected override void StartEventReact(ButtonStartPressed buttonStartPressed) switch (rocketState)
{
case RocketState.WAITFORSTART:
if (inputController.OnTouch && !inputController.OnDrag)
rocketHolder.RotateHolder(inputController.worldMousePos);
break;GlobalEventAggregator.EventAggregator.Invoke(new ButtonStartPressed());public Action<T> OnChange;Зачем понадобилось усложнять и делать родительский класс, если почти наверняка будет всего один тип ракет в игреМы рассматривали возможность нескольких вариантов ракет, одна из которых может смещаться в полёте.
Класс Rocket не должен знать про кнопку стартаНу он и не знает, ракета только знает что ей прилетает ивент на старт
Код под каждым case должен быть вынесен в отдельный метод.Согласен, я просто придерживаюсь правила — если кода не очень много, можно оставить в кейсе. Но в отдельный метод будет правильнее.
Но, вообще, класс Rocket ничего не должен знать про inputController. У Rocket должен быть отдельный компонент Driver или Engine, который должен иметь что-то типа SetTrust(float trust);В любом деле главное без фанатизма, инпут контроллер в данном ракурсе не верхняя сущность, а всего лишь источник данных для принятия решений, да, в нём есть лишние данные для ракеты, более расово правильно это было всё связать через интерфейс с конкретными штуками, но снаружи мы не можем менять данные, поэтому если торчат пара лишних для ракеты полей — ничего страшного. Всё равно эти данные будут необходимы, если не ракете, так более верхней сущности/объекту.
Зачем нужен агрегатор событий ещё и видимый всеми?Я на самом деле понимаю что у меня есть проблема с позиционированием агрегатора, ибо под капотом там ивенты, механика работы у него — по сути потоки данных, а основная фича — именно контейнеры данных. Видимость всеми — ну в этом и фича, подписка на нужный тебе тип данных. В третьей части будут модификаторы которые просто присылают данные о модификаторе, может будет более очевидно, не говоря уже о инъекциях.
Неверное именование. События называют просто Change/Click/Update а методы подписчиков уже OnChange, OnClick, OnUpdate.склонен согласиться.
Вообще, начинающие разработчики Unity (я и сам когда-то был в их числе) долгое время не понимают идеологии Unity. Идеология такая — если это что-то визуальное (звуковое и т.д.) на сцене, то это gameObject (или entity) на котором нужные компоненты, которые помогают его «визуализировать» и ничего больше. Всё, что не относится к визуализации, лучше выносить отдельно. Т.е. это чем-то похоже на MVC (gameObject это View) но совсем не MVC.
Если посмотреть на MonoBehaviour то видно, что внутри всё помогает отображать, анимировать, двигать объект и так далее. Логика должна быть снаружи.
Особенно за начинающего программиста
Мы рассматривали возможность нескольких вариантов ракет
Ну он и не знает, ракета только знает что ей прилетает ивент на старт
что у меня есть проблема с позиционированием агрегатора
это по факту куча барахла который тащит с собой монобех
лучше когда он действительно отдельный и прям либо ваще никак не связан с конкретным классами
Я против изначального дробления на мифические компоненты
вот это как раз и есть нарушения KISS в чистом виде
и поэтому активно пилят ECS для слабых мест
И про этот event не должна знатьНе согласен, вполне себе в рамках событийной модели решение. Как еще ракете узнать что пора? Вешать более верхнюю сущность и хендлить там? Что еще будет делать эта сущность? Зачем она? Откуда ракета в принципе узнает что пора? В данный момент есть условный поток данных — старт ракеты, где может быть весь необходимый контекст. Всем кому интересны эти данные — реагируют.
Только что был по лекции про DOTS, не везде он зайдет
и там очень много писанины
либо мы пользуемся обертками Unity со всеми вытекающими
Как еще ракете узнать что пора?
Откуда ракета в принципе узнает что пора?
В данный момент есть условный поток данных — старт ракеты
И это проблема — сложно тестировать поведение (например, двигателей) — нужно писать отдельный функционал для тестов. Другая проблема — inputController который жёстко зашит внутри ракеты. Что если мы хотим управлять ракетой через тесты? Что если через сеть? Что если через обучающий сценарий, что если хотим записать её полёт и повторить потом? Если бы у ракеты было просто SetTrust(float trust) то всех этих проблем не было бы — делай с ней, что хочешь.
тестирование супер изи, ибо
И вопрос с подвохом
DDD придумали не сегодня, почему он не занял доминирующую позицию в программировании?
private float ClampAngle(float angle, float from, float to)private Vector3 ClampRotationVectorZ (Vector3 rotation)private Vector3 ClampRotationVectorZ (Vector3 rotation, float clampAngle)public class ReactiveValue<T> where T: struct
Прототипирование мобильной игры, с чего начать, и как это делать. Часть 2