Ответ ментора:
1) public UnityEvent<int> OnHealthChange; - Во первых, с On именуются обработчики события события.
Во-вторых, Само событие просто сообщает, что случилось в настоящем (-ing) или прошедшем (-ed) времени, в зависимости от того, когда вызывается, до или после действия HealthChanged;.
В-третьих, не дублируйте имя класса в его членах.
2) public UnityEvent<int> OnHealthChange; - юнити ивент не самый удобный инструмент вообще и в 99% случаев достаточно стандартных событий C#.
Кроме того, назначение обработчиков из инспектора усложняет понимание кода, тк неочевидны становятся зависимости. Всегда лучше назначать обработчики явно в коде (даже у кнопок).
3) Здоровье сейчас не универсально. Максимальное здоровье должно настраиваться из инспектора. А размер урона и лечения приходить в параметрах метода. И перед тем как применять это значений, надо проверить, что оно больше 0. Чтоб здоровье не уходило за пределы диапазона, можно использовать метод Mathf.Clamp.
4) Чтоб сделать систему независимой от от границ слайдера, обычно эти границы выставляют от 0 до 1, а текущее значение определяют, как текущее ХП деленное на максимальное. Тогда даже если максимум ХП будет меняться при прокачке, по этой формуле он все ровно будет искать соотношение текущего к максимальному, которое всегда от 0 до 1 будет.
5) Smooth HealthBar.cs - файл должен называться как класс.
6) При использовании GetComponent нужно убедиться, что есть атрибут RequireComponent. https://agava.notion.site/RequireComponent-22b7c385c77546f682a0d8c3cf9998ac
7) У вас в каждом классе UI дублируется получение здоровья и подписка на него. Вынесите в базовый класс.
8) Mathf.MoveTowards(_slider.value, health, _speedChange * Time.deltaTime); - не ошибка, но рекомендую поправить. Я бы заменил на Lerp. Он позволяет более точно контролировать время. Иначе на больших дельтах долго будет плавный бар догонять (что у вас на видео и видно). Только хорошо осознайте, за что отвечает каждый параметр. Каждый раз брать в качестве стартового значения текущее положение слайдера - не корректно. Нужно запомнить его положение на момент старта корутины и изменяя 3й параметр (обычно опираясь на время) от 0 до 1 мы смещаем выходное число от начального к конечному положению, где 0 - стартовое, а 1 - целевое значение.