보유 직원 목록 content

 

보유 직원 아이콘에 필요한 요소들을 추가하였다.

이름, 등급, 프로필 이미지라는 최소한의 정보만 들어갈 예정이다.

임의로 소환하여 사용해야 하기 때문에 프리팹으로 만들었다.

 

다른 부분은 Character 객체에서 가져와 그대로 넣어주면 되지만 등급을 나타내는 별은 Enum값으로 되어있기 때문에 매치되는 별 이미지를 넣어야 했다.

 

 

 하는 김에 별 이미지도 직접 그렸다.

적용하면 이런 느낌인데 나쁘지 않은 것 같다.

아님 말고.

 

    public class EmployeeButton : MonoBehaviour
    {
        #region Property

        #endregion

        #region Variable
        [SerializeField] private Button button;
        [SerializeField] private Image profileImage;
        [SerializeField] private Image starImage;
        [SerializeField] private TextMeshProUGUI nameTMP;

        #endregion

        #region Public Method

        public EmployeeButton SetEmployeeButton(Employee employee, Sprite starSprite, Action<Employee> onClick) 
        {
            profileImage.sprite = employee.Character.ProfileSprite;
            nameTMP.text = employee.Character.Name;
            starImage.sprite = starSprite;

            button.onClick.AddListener(() => onClick.Invoke(employee));

            return this;
        }

        #endregion

        #region Private Method

        #endregion
    }

 

이 버튼의 역할은 자신이 가리키는 직원이 누구인지만 알려주면 되기 때문에 간단하다.

캐릭터의 등급은 원래 enum 값으로 기록하고 있기 때문에 starSprite라는 매개변수를 따로 받았다.

이 sprite들은 EmployeeUIView가 가지고 있을 예정이다.

 

 

 

보유 직원 목록 불러오기&직원 버튼 누르면 상세 정보 띄우기

 

또 그림부터 그렸다.

앞으로 프로토타입을 완성할 때까지 테스트용으로 쓰일 기본 직원이다.

물론 실제로 사용할 스프라이트로 만들 때는 명암도 넣고 스탠딩 애니메이션도 만들어야 할 텐데... 일단 생각하지 말자.

 

우선, 원래대로라면 따로 json파일로 저장된 직원 목록을 불러와 리스트를 작성하는 것이 올바른 로직이다.

그러나 지금은 필요한 건 UI 테스트이기 때문에 일단 임의로 직원을 생성하겠다.

 

[CreateAssetMenu(fileName = "Character Data", menuName = "Scriptable Object/Character Data")]
public class Character : ScriptableObject
{
    public string Name;
    public Sprite ProfileSprite;
    public Sprite StandingSprite;
    public Grade Grade;
    public string Description;
    public int ID;
}

 

우선 캐릭터는 ScriptableObject로 관리한다.

이것도 나중에는 CSV파일에서 정보를 불러오도록 수정할 생각이다.

 

public class Employee
{
    public Character Character { get; private set; }
    public Rank Rank { get; private set; }
    public Level Level { get; private set; }
    public Limit Limit { get; private set; }
    public float Proficiency { get; private set; }
    public float EXP { get; private set; }

    public Employee(Character character)
    {
        Character = character;
        Rank = Rank.employee;
        Level = Level.newcomer;
        Limit = Limit.none;
        Proficiency = 0;
        EXP = 0;
    }

    public void SetEmployee(Character character)
    {
        Character = character;
        Rank = Rank.employee;
        Level = Level.newcomer;
        Limit = Limit.none;
        Proficiency = 0;
        EXP = 0;
    }

    public void SetEXP(float exp)
    {
        EXP = exp;
    }

    public void SetLevel(Level level)
    {
        Level = level;
    }

    public void SetRank(Rank rank)
    {
        Rank = rank;
    }

    public void SetLimit(Limit limit)
    {
        Limit = limit;
    }

    public void SetProficiency(float proficiency)
    {
        Proficiency = proficiency;
    }
}

 

계속 등장할 Employee라는 객체는 Character를 참조하고 있다.

이 또한 데이터를 저장할 용도일 뿐이기 때문에 C# 클래스로 작성하였다.

 

public void Initialize()
{
    employees = new List<Employee>();
    CreateEmployeesForTest();
    uIPresenter.Initialize(employees, (Employee employee) => Grow(employee));
}

#endregion

#region private Method
private void CreateEmployeesForTest()
{
    foreach (Character character in characters)
    {
        employees.Add(new Employee(character));
    }
}

 

이제 구현을 위한 EmployeePresenter의 주요 부분을 살펴보겠다.

함수 이름을 보면 알 수 있듯, 테스트를 위해 임의로 Employee를 생성하여 리스트에 집어넣었다.

uiPresenter를 초기화시키고 있는데 UI에서 급여 버튼을 눌렸을 때 해당 직원 정보를 가져와 연산을 할 예정이기 때문에 콜백 함수를 등록하였다.

 

        public void Initialize(List<Employee> employees, Action<Employee> onClickSararyButton)
        {
            view.Initialize();

            this.onClickSararyButton = onClickSararyButton;
            CreateEmployeeButtons(employees);

            AddListeners();
        }

        private void CreateEmployeeButtons(List<Employee> employees)
        {
            employeeButtons = new List<EmployeeButton>();
            foreach (Employee employee in employees) 
            {
                CreateEmployeeButton(employee);
            }
        }

        private void CreateEmployeeButton(Employee employee)
        {
            employeeButtons.Add(Instantiate(employeeButton, view.EmployeeListParent)
                .SetEmployeeButton(employee, view.StarSprites[(int)employee.Character.Grade], (Employee employee) => 
                {
                    SetSelectedEmployeePanel(employee);
                    AddSelectedEmployeePanelListeners(employee);
                    view.ShowSelectedEmployeePanel(true);
                }));
        }

        private void SetSelectedEmployeePanel(Employee employee)
        {
            // EXP 부분은 따로 남은 EXP를 구하는 수식을 만들 예정.
            // 직원 성장 기능을 추가할 때 변경하겠음.
            view.SetSelectedEmployeePanel(view.StarSprites[(int)employee.Character.Grade], employee.Character.ProfileSprite, employee.Rank.ToString(), employee.Character.Name
                , ((int)employee.Limit).ToString(), (employee.EXP).ToString(), employee.Character.Description);
        }

 

이번에는 EmployeeUIPresenter의 주요 부분이다.

초기화에서 받아온 Employee 리스트로 버튼 목록을 만들고 있다. (CreateEmployeeButtons, CreateEmployeeButton)

그리고 EmployeeButton에 콜백을 등록하여 선택한 employee 정보들로 세부 정보 화면을 구성하도록 하였다.

 

 

 

 

 

오늘의 회고

오늘은 평소보다 빨리 끝내서 시간이 많이 남는다.

그렇다고 개발을 더 하기보다는 그림을 좀 그려서 리소스를 준비하고 오래간만에 플스를 켜야겠다 ㅎㅎ

그리고 대신 내일 일정을 추가하여 캐릭터를 scriptable object가 아닌 csv에서 가져오는 방식으로 바꿀 것이다.

캐릭터 테이블 만들기는 덤.

 

+ Recent posts