코드

public class UIManager : InGameSingleton<UIManager>
{
    [SerializeField] private List<BaseUI> uiList;

    //UI를 여는 함수를 제네릭으로 선언
    public void Show<T>(params object[] param) where T : BaseUI
    {
        var ui = uiList.Find(obj => obj.name == typeof(T).ToString());
        if(ui != null)
        {
            ui.SetActive(true);
            ui.opened.Invoke(param);
        }
    }

    //UI를 닫는 함수를 제네릭으로 선언
    public void Hide<T>(params object[] param) where T : BaseUI
    {
        
        var ui = uiList.Find(obj => obj.name == typeof(T).ToString());
        if (ui != null)
        {
            ui.SetActive(false);
            ui.closed.Invoke(param);
        }
    }    
}

분석

장점

  1. 싱글톤 패턴 사용:
    • InGameSingleton를 상속받아 싱글톤 패턴을 구현함으로써, 게임 내에서 유일한 인스턴스를 보장합니다. 이는 여러 곳에서 동일한 매니저 인스턴스를 참조할 수 있게 해줍니다.

  2. 유닛 스폰 기능:
    • 다양한 유닛 스폰 기능을 제공합니다. 예를 들어, SpawnUnit, LoadUnit, SpawnUnitRed 메서드를 통해 유닛을 스폰할 수 있습니다.
    • 유닛이 스폰될 위치가 이미 차지되어 있는지 확인하고, 새로운 위치를 찾는 로직이 포함되어 있습니다.

  3. 유닛 스폰 버튼 생성:
    • CreateSpawnBtn 메서드를 통해 유닛 스폰 버튼을 동적으로 생성하고, 버튼 클릭 시 유닛을 스폰하는 기능을 제공합니다.

  4. 화폐 체크 및 환불 기능:
    • CheckCurrency와 RefundCost 메서드를 통해 유닛 스폰 시 필요한 화폐를 체크하고, 스폰 실패 시 화폐를 환불하는 기능을 제공합니다.

  5. 오브젝트 풀 초기화:
    • DisableObjectPool 메서드를 통해 오브젝트 풀을 초기화하고, 자식 오브젝트들을 비활성화하는 기능을 제공합니다.


단점

  1. 하드코딩된 값:
    • checkRadius, maxDistance, stepSize 등의 값이 하드코딩되어 있어, 유연성이 떨어질 수 있습니다. 이러한 값들은 설정 파일이나 인스펙터를 통해 조정 가능하도록 하는 것이 좋습니다.
  2. 의존성 주입 부족:
    • DataManager, CurrencyEventHandler 등의 인스턴스를 직접 참조하고 있어, 의존성 주입을 통해 더 유연하게 관리할 수 있습니다.
  3. 에러 처리 부족:
    • 예외 상황에 대한 에러 처리가 부족합니다. 예를 들어, unitDataSO나 unitPrefabs가 null일 경우에 대한 처리가 필요합니다.
  4. 코드 중복:
    • CheckCurrency 메서드에서 화폐 타입에 따라 거의 동일한 로직이 반복됩니다. 이를 리팩토링하여 중복을 줄일 수 있습니다.
  5. 유닛 스폰 위치 탐색 로직 개선 필요:
    • FindNewPosition 메서드에서 새로운 위치를 찾는 로직이 단순히 오른쪽 방향으로만 탐색합니다. 더 복잡한 탐색 알고리즘을 도입하여 다양한 방향으로 탐색할 수 있도록 개선할 수 있습니다.
  6. 코루틴 사용:
    • CheckSpriteData 메서드에서 코루틴을 사용하여 스프라이트 데이터를 로드하는데, 이는 비동기 작업을 처리하는 더 나은 방법이 있을 수 있습니다. 예를 들어, async/await 패턴을 사용할 수 있습니다.

개선 제안

  1. 설정 파일 사용:
    • 하드코딩된 값을 설정 파일이나 인스펙터를 통해 조정 가능하도록 변경합니다.
  2. 의존성 주입:
    • DataManager, CurrencyEventHandler 등의 인스턴스를 의존성 주입을 통해 관리합니다.
  3. 에러 처리 추가:
    • 예외 상황에 대한 에러 처리를 추가하여 코드의 안정성을 높입니다.
  4. 코드 중복 제거:
    • CheckCurrency 메서드를 리팩토링하여 중복 코드를 제거합니다.
  5. 탐색 알고리즘 개선:
    • FindNewPosition 메서드에서 다양한 방향으로 탐색할 수 있도록 알고리즘을 개선합니다.
  6. 비동기 작업 개선:
    • CheckSpriteData 메서드에서 async/await 패턴을 사용하여 비동기 작업을 처리합니다.
profile
스터디 로그

0개의 댓글