EnemyPresenter와 EnemyView는 정상 작동하지만, EnemyView의 HP와 Stamina UI만 업데이트되지 않는 기묘한 현상이 발생했다.
같은 CharacterView와 CharacterPresenter를 상속받는 PlayerPresenter 쪽은 문제없이 작동하는데, Enemy 쪽만 UI가 반응하지 않았다.
문제의 핵심은 EnemyPresenter가 바라보는 Model과 EnemyView가 바라보는 Model이 서로 달랐다는 점이다.
PlayerPresenter의 경우:
EnemyPresenter의 경우:
// 문제가 있던 코드
builder.Register(resolver => new Enemy(), Lifetime.Scoped);
이후 BattleService에서 실제 Enemy가 로드되면 SetEnemy()를 호출해 Presenter의 Model을 교체하는 방식을 사용했다.
결과적으로 EnemyPresenter는 실제 Enemy를, EnemyView는 더미 Enemy를 참조하는 상황이 발생했다.
SetEnemy() 메서드에서 이벤트 구독과 View-Model 연결을 다시 수행했다.
public void SetEnemy(Enemy enemy)
{
_model = enemy;
// 이벤트 재구독
// View와 Model 재연결
}
동작은 하지만 찝찝했다. 생성자에서 한 번 연결했는데 또 다시 연결하는 게 깔끔하지 않았다.
CharacterPresenter의 책임 분리:
CharacterPresenter는 생성자에서 View만 받도록 변경PlayerPresenter와 EnemyPresenter가 각자 처리// CharacterPresenter - 추상 클래스
public abstract class CharacterPresenter
{
protected CharacterView _view;
protected CharacterPresenter(CharacterView view)
{
_view = view;
}
}
// PlayerPresenter - Player Model은 DI로 주입
public class PlayerPresenter : CharacterPresenter
{
public PlayerPresenter(PlayerView view, Player model) : base(view)
{
// Model 초기화
}
}
// EnemyPresenter - Model은 나중에 설정
public class EnemyPresenter : CharacterPresenter
{
public EnemyPresenter(EnemyView view) : base(view)
{
}
public void SetEnemy(Enemy enemy)
{
// 최초 Model 설정
}
}
BattleSceneLifetimeScope 정리: