inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

UI 자동화 #2

질문있습니다@!!

393

toyboy0113

작성한 질문수 23

0

안녕하세요 강의를 듣다 enum으로 하나씩 넣는게 제 개인적인 생각으로는 귀찮다라는 생각을 받았어요 그래서 이걸 오브젝트의 이름만 받아서 사용할 수 있게 해보자 해서 짜봤는데

 

강의에서 소개해주신 enum으로 관리하는 것과 제 코드와 비교해서 enum으로 관리할 때의 장점이 있을까요?

 

그리고 아래 코드에서 개선할만한 부분도 있다면 알려주시면 감사하겠습니다

private Dictionary<Type, UnityEngine.Object[]> _componentDictionary = new Dictionary<Type, UnityEngine.Object[]>();

private void Start()
{
    Bind<Button>();
    Bind<TextMeshProUGUI>();
    Bind<Image>();
    Bind<GameObject>();

    Debug.Log(Get<GameObject>("ddd").transform.position.x);
}

void Bind<T>() where T : UnityEngine.Object
{
    //필터 해줄 타입 추가
    if (typeof(T) != typeof(Button) && typeof(T) != typeof(TextMeshProUGUI) && typeof(T) != typeof(Image) && typeof(T) != typeof(GameObject)) return;

    
    if (typeof(T) == typeof(GameObject))
    {
        Transform[] transforms = Util.FindChild<Transform>(transform, true);
        GameObject[] gameObjects = new GameObject[transforms.Length];
        for (int i = 0; i < transforms.Length; i++)
        {
            gameObjects[i] = transforms[i].gameObject;
        }
        
        _componentDictionary.Add(typeof(GameObject), gameObjects);
        return;
    }

    T[] objects = Util.FindChild<T>(transform, true);

    _componentDictionary.Add(typeof(T), objects);
}

T Get<T>(string name) where T : UnityEngine.Object
{
    UnityEngine.Object[] objects = null;
    if (_componentDictionary.TryGetValue(typeof(T), out objects) == false) return null;

    foreach (UnityEngine.Object obj in objects)
    {
        if (obj.name == name) return obj as T;
    }

    return null;
}

 

public static T[] FindChild<T>(UnityEngine.Transform transform, bool recursive = false) where T : UnityEngine.Object
{
    if (transform == null) return null;

    if (recursive == false)
    {
        T[] dd = new T[transform.childCount];
        
        for (int i = 0; i < transform.childCount; i++)
        {
            dd[i] = transform.GetChild(i).GetComponent<T>();
        }
        return dd;
    }
    else
    {
        return transform.GetComponentsInChildren<T>();
    }
}

C# unity

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.
toyboy0113님, 질문 주셔서 감사합니다. Enum을 이용하여 관리할 때의 장점에 대해 설명드리겠습니다.

Enum을 사용할 때의 주된 장점은 다음과 같습니다:
1. 코드의 가독성 향상: Enum은 상수들의 집합으로, 의미 있는 이름을 부여할 수 있어 가독성이 좋아집니다.
2. 유효한 값의 제한: Enum은 사전에 정의된 값들만 사용하기 때문에, 잘못된 값을 사용할 위험이 줄어듭니다.
3. 리팩토링 용이: Enum의 이름이 변경되면 컴파일 타임에 오류를 찾아낼 수 있어서, 안전하게 리팩토링이 가능합니다.
4. 타입 안정성: Enum은 특정 타입만을 허용하기 때문에 타입 안정성을 보장받을 수 있습니다.

제시해주신 코드를 보면, 오브젝트 이름으로 컴포넌트를 관리하시려는 것 같습니다. 이 방법도 동작에는 문제가 없지만, Enum을 사용하지 않을 경우 발생할 수 있는 단점으로는 실수로 잘못된 문자열을 입력했을 때 오류를 컴파일 시점이 아니라 런타임에서야 발견할 수 있다는 점입니다. 이 때문에 오류 발견과 디버깅이 어려워질 수 있습니다.

코드 개선에 대해서 몇 가지 제안해보겠습니다:
- Bind<T>() 메서드에서 특정 타입을 필터링 하고 있는 부분은 확장성이 떨어지므로, 필터링 없이 모든 T 타입에 대해 동작하도록 개선할 수 있습니다. 필터링이 필요한 경우 별도의 메서드나 로직을 추가하는 것이 좋습니다.
- Dictionary<Type, UnityEngine.Object[]>의 대신 Dictionary<Type, Dictionary<string, UnityEngine.Object>> 형태로 관리하면 이름으로 바로 접근이 가능하므로 효율적일 수 있습니다.
- 예외 처리: FindChild<T>() 메서드에서는 null을 반환하기보다는 빈 배열을 반환하는 것이 더 안전한 코딩 관행입니다.

코드의 구조나 목적 등에 따라 위의 조언이 모두 적용되는 것은 아니므로, 상황에 맞게 적용하시는 것이 좋습니다.

비쥬얼 스튜디오에서 unity연결이 없습니다.

0

38

2

UI 기능 관련 질문이 있습니다!

0

46

2

픽셀 좌표 스크린 좌표

0

35

0

전체적으로 코드 읽는게 굉장히 오래 걸리네요...

0

83

2

카메라 #2 수업 캐릭터 쓰러짐 해결

0

87

1

플레이어 움직임이 끝날때, 기울어짐 현상

0

86

1

Input 적용과 관련하여 질문 있습니다.

0

76

1

디버그 불가.. Unity에 연결 불가

0

85

1

달리기 애니메이션 에러

0

91

2

오랜만에 게임을 만들다가 사운드 관련해서 뭔가 궁금한게 있어서 봤습니다

0

67

1

GetKey 오류

0

114

2

에셋을 어디에 올려두신지 알 수 있나요?

0

109

1

재귀호출? 오류나는데 왜 이래요 ?

0

170

6

Animation blending 파라미터 계산

0

70

1

newPos와 to지점이 겹쳐져야 하는거 아닌가요?

0

98

3

오브젝트 복제하니까 자꾸 이런게 뜨면서 꺼집니다

0

89

2

질문있습니다

0

144

2

아 이거 소스코드 같은거 없나요?

0

144

3

질문 드립니다. string.IsNullOrEmpty(name)

0

89

2

@Managers 가 씬에 배치되어 있어도 문제가 되지 않나요?

0

137

2

유니티6 NavMesh 안되는분들

1

177

1

Unity6 Unity-Chan Material 마젠타 문제 해결법

7

535

1

GetComponent<Poolable> 질문드립니다.

0

104

2

UI 불러오지 못함

0

120

2