Are you using the Reset Level node or the Load Level node with the same level name? Either one will have the same effect. This does not reset your widgets in the viewport. So the setup code in your viewport widget won’t run again. This is why I wanted you to put your setup code in your player character actor. This is why I said to get rid of SettingHpBar. That function keeps causing you issues.
In your player character’s BeginPlay event, do this:
TArray<UUserWidget*> HpWidgets;
bool TopLevelOnly = false;
UWidgetBlueprintLibrary::GetAllWidgetsOfClass(this->GetWorld(), HpWidgets, UOLHpBarWidget::StaticClass(), TopLevelOnly);
check(!HpWidgets.IsEmpty());
UOLHpBarWidget* HpBarWidget = Cast<UOLHpBarWidget>(HpWidgets[0]);
OnHpWidgetChange.BindUObject(HpBarWidget, &UOLHpBarWidget::UpdateHpBar);
You’ll need this include at the top of your file somewhere.
#include "Blueprint/WidgetBlueprintLibrary.h"
And get rid of SettingHpBar.
Also, how are you adding the viewport widget? Make sure you’re not adding it twice. Or if you are, make sure the original one is removed.