보스HP가 애니메이션 효과로 줄어들게 구현하고 보니
(7가지 색의 SingleBar 를 만들고 curHpBar는 빨주노초파남보 라면
밑에 있는 BelowHpBar는 주노초파남보빨 로 나오게 하고
curHpBar가 Singlebar의 끝까지 가면 주황이나오고 belowHpBar는 노랑이 나오도록 설계하고
이를 루프를 돌리고 마지막에 hp가 0이 될 때는 검은색으로 나오게 만들었다.)
이 것을 보스에만 구현해놓고 이제 주인공 HP에 구현하려고 보니, 이 코드를 다시 만들어야 되는 것이다.
그래서 재사용할 수 있게 만들어 보니 몇가지 테크닉이 들어가게 되었다.
1. static class를 지정한다.
사용 이유를 정확하게는 알 수 없으나 공용으로 쓰이는 메소드를 static class에 넣어 쓰면 재사용하기에 좋다고 한다.
이 경우에 GetColorByBarIndex로 7가지 색중 어느 index를 불러와야 할지 정하는 메소드를 static으로 만들어서 공용으로 컬러 값을 가져올 수 있게 하였다.
public static class HpColorHelper
{
public static Color GetColorByBarIndex(int index, List<Color> barColors, Color depletedColor)
{
if (index < 0) return depletedColor;
if (barColors == null || barColors.Count == 0) return Color.white;
return barColors[index % barColors.Count];
}
}
2. baseHpView를 만들어 거기에 색깔 계산과 애니메이션효과와 현재피/전체피 텍스트를 적게 했다.
이렇게 하면 bassHpView를 상속받으면 bassHpView에서 로딩하는 UpdateHpBar(...) 클래스를
가져오게 되니 한번 만든 코드를 재사용할 수 있게 되었다.
3. Interface를 사용하여 Presenter에서 view를 가져온다.
아직 정확하게 감이 잡힌 건 아닌데 interface를 쓰면 Presenter에서 view가 바뀌어도 코드 바꿀 필요가 없어서 유연성이 증가된다고 한다.
이런 식으로 interface를 선언 하고
public interface IHpBarView
{
void UpdateHpBar(int currentHp, int maxHp);
}
Interface를 상속 받아 같은 구조로 된 메소드에 구현 한다.
using UnityEngine;
using UnityEngine.UI;
public class BaseHpBarView : MonoBehaviour, IHpBarView
{
[SerializeField] private Image hpImage;
// 인터페이스 메서드 구현 → 반드시 public
public void UpdateHpBar(int currentHp, int maxHp)
{
float ratio = (float)currentHp / maxHp;
hpImage.fillAmount = ratio; // 단순 예제
}
}
그러면 하위 클래스는 코드 없이 사용가능하다.
public class BossHpBarView : BaseHpBarView
{
// IHpBarView 다시 구현할 필요 없음
// 필요 시 UpdateHpBar override 가능
}
public class MainCharHpBarView : BaseHpBarView
{
// 특화 로직 override 가능
}
Presenter에서 호출 할 떄는 아래와 같이 쓴다.
public class HpBarPresenter : MonoBehaviour
{
private IHpBarView view;
private int currentHp = 100;
private int maxHp = 100;
// Init 메서드로 런타임에 View 주입
public void Init(IHpBarView view)
{
this.view = view;
view.UpdateHpBar(currentHp, maxHp); // 초기화
}
public void TakeDamage(int dmg)
{
currentHp = Mathf.Max(0, currentHp - dmg);
view.UpdateHpBar(currentHp, maxHp);
}
}
핵심은 IHpBarView를 넘겨받아 쓴다는 것이다. 그래서 baseView던지 boss던지 mainchar던지 상관없이 view를 넘겨 받을 수 있다는 게 핵심으로 보인다.
chatGPT의 도움을 받아 작성하였습니다.
댓글 없음:
댓글 쓰기