인프런 커뮤니티 질문&답변

황주은님의 프로필 이미지
황주은

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

인벤토리 실습 #2

enum을 이용한 UI자동화를 한 경우는 값이 자주 바뀌어야하면 비효율적인가요?

해결된 질문

작성

·

192

·

수정됨

0

안녕하세요! 강사님

이번 프로젝트에서 더 나아가 rpg 연습 프로젝트를 하는 도중 인벤토리 구현을 하는데 있어서 궁금한 것이 있어 질문 남깁니다.

아래처럼 슬롯 UI를 구현해서 이제 Clear일때는 text,와 image를 지워주고 update에는 또 새로운 값을 대입해주거나 해야하는데 그때마다 Get~= null, Get~= stack++;이런식으로 해주어야하는건가요? 클래스 멤버변수로 Text stackText 를 하나 선언해서 Init할때 stackText = Get~ 이런식으로 받아놓고 사용하면되는걸까요?

다루어야할 데이터가 늘어나면 enum형에 있는만큼 더생기니까 뭔가 바인딩하려고 enum형에 다 선언을 해놨는데 변수를 하나 더 만드는 거 같아 이런식으로 사용하는게 맞는지 모르겟습니다.

 

머리를 굴려서 생각해본 결과 SetInfo를 값을 변화시켜야할때마다 호출하는 방식으로 해놓긴했습니다ㅠㅠ

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UI;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;

public class UI_InvenItemSlot : UI_Base
{
    enum Images { ItemImage }
    enum Texts { ItemStackText }

    void Start()
    {
        Init();
    }

    public override void Init()
    {
        Bind<GameObject>(typeof(Texts));
        Bind<GameObject>(typeof(Images));
        
        //클릭했을 때, 장착 바뀌기 이런 이벤트 함수 만들어서 연결
    }

    private void OnClickSlot()
    {
    }

    private void ClearSlot()
    {
        // image =null
        //itemstacktext= null
    }
      private void UpdateStackText()
    {
        
    }

    private void SetInfo(Sprite image, int stackCnt)
    {
        GetText((int)Texts.ItemStackText).text = stackCnt.ToString();
        GetImage((int)Images.ItemImage).sprite = image;
    }
    //슬롯 인덱스
    // 슬롯 아이템 보유 여부
    // 슬롯 접근 가능 여부 -> 다른 종류 아이템이거나 꽉찼으면 접근 X
    // 아이템 이미지
    // 수량 텍스트
    
    //기능
    // 아이템 이미지 변경/ 보이기/ 숨기기
    // 수량 텍스트 변경/보이기/숨기기
  
    // 슬롯 접근가능 여부 변경
}

답변 2

2

Rookiss님의 프로필 이미지
Rookiss
지식공유자

Binding을 한 번 했으면 지울 필요가 없습니다.
Clear의 경우에도 바인딩을 날리는게 아니라,
SetInfo(int itemTemplateID)를 0번으로 호출해서 아이템이 없는 것을 확인 후
GetText((int)Texts.ItemStackText).text = "";

GetImage((int)Images.ItemImage).sprite = null;
~처럼 밀어주는게 국룰입니다.

황주은님의 프로필 이미지
황주은
질문자

답변 감사합니다 강사님! 좋은 하루 되세요

0

안녕하세요, 인프런 AI 인턴입니다.

질문해주신 내용에 대해 답변드리겠습니다.

enum을 이용한 UI 자동화에서 값이 자주 바뀌는 경우, 일정 부분 비효율적일 수 있습니다. enum은 기본적으로 고정된 상수의 집합을 표현하는데 사용되며, 값의 변화가 많은 상황에서는 유연성이 떨어질 수 있습니다. 따라서, 데이터의 변화가 빈번하거나 동적으로 처리해야 할 요소가 많은 경우에는 enum보다는 다른 방식을 고려하는 것이 좋습니다.

스크립트에서 클래스 멤버변수로 Text와 Image와 같은 UI 컴포넌트를 선언하고, Init 함수에서 해당 컴포넌트를 찾아 할당해놓고 사용하는 방식은 괜찮은 접근입니다. 이렇게 하면 필요할 때마다 GetComponent를 호출하여 성능 저하를 일으킬 수 있는 요소를 줄일 수 있습니다.

enum 형을 사용하여 UI 요소를 관리하는 부분에 대해 거듭 고민 중이신 것으로 보입니다. 변수를 너무 많이 생성하는 것에 대한 우려는 이해가 됩니다. 하지만, 유지보수와 코드의 가독성 측면에서 볼 때, 적절한 수준에서 enum과 클래스 멤버변수를 활용하는 것은 올바른 접근입니다. 프로젝트의 규모나 복잡도에 따라 가장 적합한 방식이 달라질 수 있으니, 개발 과정에서 여러 방법을 시도해보고 프로젝트에 가장 적합한 방법을 선택하는 것이 좋습니다.

SetInfo 함수를 값 변화 시마다 호출하는 방식도 유효합니다. 이러한 방식은 UI의 상태를 즉시 업데이트하며 사용자 인터페이스의 동적인 변화를 효과적으로 처리할 수 있습니다.

결론적으로, UI 자동화 구현에 있어서 가장 중요한 것은 프로젝트의 규모, 유지보수의 용이성 및 성능 등을 고려하여 최적의 방법을 선택하는 것입니다. 다양한 방안을 시도해보고 그 중에서 가장 효율적이고 관리하기 편한 방법을 찾는 과정이 중요합니다.

황주은님의 프로필 이미지
황주은

작성한 질문수

질문하기