안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

레이블이 보스와 주인공 HP 처리 방법이 같으면 코드를 재사용하는 방법인 게시물을 표시합니다. 모든 게시물 표시
레이블이 보스와 주인공 HP 처리 방법이 같으면 코드를 재사용하는 방법인 게시물을 표시합니다. 모든 게시물 표시

2025년 12월 6일 토요일

[유니티][Unity] 보스HP와 주인공HP를 계산하는 방법이 같을 때 하나의 코드로 처리하는 방법

  보스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의 도움을 받아 작성하였습니다.