Как стать автором
Обновить

Комментарии 6

Картинка к посту по-моему и есть иллюстрация выстрела в ногу

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

public class Repository<T>
{
    public IEnumerable<T> Items => _items.Values;

    private readonly Dictionary<Guid, T> _items = new();

    public void Register(Guid id, T item) => 
        _items.Add(id, item);

    public void Unregister(Guid id) => 
        _items.Remove(id);

    public void ForEach(Action<T> action)
    {
        foreach (T item in _items.Values.ToArray())
            action(item);
    }
}

Это костыль. Он жрет ресурсы, причем в часто вызываемом методе. Хотя у вас там Guid, он еще и памяти сожрет ибо ValueType. Как бы тоже решение, просто неоптимальное.

Если объектов будет, например - лям, то там 16*10^6 байт памяти под одни ток гуидники будет выделятся на каждом апдейте, вроде как. 15,25.. Мбайт памяти вроде как. Эт будет, допустим 60fps - по гигу памяти в секунду? Сборщик мусора повесится) у меня походу профдеформация после bigdata)

Лучше делать отдельный механизм для удаления элементов, и не давать трогать _items. Обычно я делаю список на удаление и удаляю по списку сразу после цикла. У вас наружу еще и Items торчит, так что может возникнуть трабл с перечислением снаружи. В зависимости от требований к многопоточности - разные решения.

Гугльнул, пишут мол делать проверку на энумерации if(x){remove} но эт лишняя комманда в цикле, не оч хорошо. Хотя мб для многопоточности - норм, но мне чот семафоров хочется и блокировок)

По большому счёту все юниты должны быть набором систем из которых конструируются эти юниты, а не как у автора - класс с набором пропертей и все проверки по идее должны происходить для всех юнитов, а не для каждого по отдельности. Тогда оно и в памяти лежать будет лучше и процессору в кэшлинию попадать предсказуемо станут. То бишь пилить всё это надо было или на Unity Jobs или на DOTS, чтобы действительно считать это нормальной интеграцией с Unity.

Да у автора вообще много жести, прост мне за код ревью и наставничество в интернетах не платят)

Например Resources.Load<Character>("Character") эт жоский хардкод, прям вообще мрак.

Монобихавор для чарактера - это вообще божественный объект, без разделения ответственности.

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

Хотябы это: public bool CanExecute => !_context.HasEnemy;

Оно тут воткнуто просто потому что типа должен быть предикат CanExecute, чонить да воткнем. Какой в этом вообще смысл - никакого, просто натянуть чонить на паттерн.

В итоге статья - никакущая, код вообще никак не про r-b ai, даже не близко. Тут самописный компонентный подход аля юнити просто потому что в юнити так и мы тож этот паттерн будем втыкать на верхнем уровне архитектуры просто потому что. И обзовем это аи, воткнем интерфейс не в тему. И вуаля, читайте - набирайтесь мудрости, дорогие мои.

Меня эт не особо удивляет уже, каждую неделю натыкаюсь на "делаем * на юнити!" и какая-то жесть внутри) так то не вижу ничего особо плохого в этом - ресурс же социальный. Просто иронично, что несведущий пишет обучающие статьи) Но этакая форма рефлексии, почему бы и нет. Я иногда таким занимаюсь, по пути написания - углубляюсь в тему, конспектирую, провожу анализ. Но это скорее как научно исследовательская работа.

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

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

Причем, почему то Die : IRule Хотя это не к аи относится, а к внутриигровой логике. В итоге все смешалось в кучу - люди, кони. Началась грызня.

Кстати:

Владелец видео запретил его просмотр на других сайтах.

Причём тут Rule-based? Это просто самописная компонентая модель, к тому же медленная и неоптимальная, с единственной разницей, что обновляется один компонент (Rule) за тик. Можно переименовать это в Action/Decision/Behaviour/Component-based AI и смысл вообще никак не изменится. По запросу Rule-based выдаёт множество статей про machine learning, по играм инфы мало, а если и есть, то там совсем про другое. Тут либо что-то недопоняли и переврали, либо придумали что-то своё, но дали этому название вводящие в заблуждение, так ещё и с реализацией накосячили.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории