ДевЛог #19 - Интерфейс

Одной из первых проблем в юнити оказалась проблема обновления интерфейса. Суть проблемы - есть, например, здоровье игрока, а есть шкала здоровья на канве. Как их увязать вместе? Пост - скорее вопрос, нежели рассказ о том как всё прекрасно!

ДевЛог #19 - Интерфейс

Первое, что приходит в голову это сделать для индикатора здоровья скрипт, в котором в Update обновлять значение из модели. И это рабочий вариант, однако, он имеет ряд неудобств. В частности под каждую отображаему на экране сущность (здоровье, опыт, уровень, щит и т.п.) придётся делать отдельные скрипты, буквально на несколько строчек. Вторая проблема - обновляться информация будет каждый кадр, а значит будет прилично затормаживать игру. Не всегда же опыт или здоровье меняется каждый кадр и уж тем более уровень!

Дальше становится понятно, что скрипт проще сделать один, а нужные элементы интерфейса в него посвязывать через инспектор. Это решает проблему большого количества файлов и кучи мелких Update. Но оставляет вторую проблему нетронутой.

Так что же делать!?

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

Поэтому следующим шагом на пути к удобству и красоте стало внедрение событий. С событиями всё прекрасно: изменилось здоровье - выстрелило событие, интерфейс, подписанный на событие получил уведомление и всё изменил. Одна только проблема - стартовые значения. Так как они инициализируются раньше слушателя, то слушатель их не получает.

И было бы прекрасно послать изменение всех свойств сразу после подписки, но сразу встаёт вопрос, а точнее два: А точно ли надо так делать и верная ли дорога?

Может быть есть какие-то другие пути, более красивые и удобные для решения такой проблемы? Очень жду ваших комментариев!

33
10 комментариев

Обновлять в апдейте UI - зло. Просто удар по производительности. Так что переход к событиям оправдан.
Можно посмотреть ещё библиотеку UniRx, но если текущая проблема вызвала вопросы, возможно, смотреть в сторону реактивов ещё рано.
P.S от событий надо не забывать отписываться, а то можно словить утечки памяти и нулл рефы.
P.P.S проставить стартовые параметры можно в том же месте, где передается объект, на который можно подписываться (ты же, надеюсь, через код это делаешь, а не через эдитор?)

Ответить

>P.S от событий надо не забывать отписываться, а то можно словить утечки памяти и нулл рефы.Про отписку-то понятно, спасибо. Утечек нам не надо. Жаль, что шарпы сами не отписываются при смерти слушателя.

>P.P.S проставить стартовые параметры можно в том же месте, где передается объект, на который можно подписываться (ты же, надеюсь, через код это делаешь, а не через эдитор?)Конечно через код. Оно сейчас в коде и инициализируется так при подписке. Но мне отчего-то не нравится так, некрасиво и не универсально, есть шанс что-то пропустить.

Ответить

Я посмотрел предыдущие посты. Точно переходи на UniRx)

Ответить