Unity3D/유니티 공부

[유니티] UI - 1

상연 2022. 1. 21. 17:50

목차

    지난번 '러닝하이'프로젝트를 하면서 정말 세상에서 제일 귀찮았던것은 UI 작업이었다.

    UI 배치는 뭐... Scene에서 그냥 휘적휘적하면서 올려두고 뭐 하고 하면 되는데

    UI 오브젝트를 스크립트상에서 제 기능을 하도록 이벤트 연결하고, 스크립트 상에서 문자를 넣고 하는게 너무 단순반복 노가다 같고 재미가 없었다.

    그도 그럴게 나 같은 경우에는 어떻게 하면 효율적으로 할 수 있을지 크게 생각을 못하고

    그냥 오브젝트 하나하나 불러오거나, 기껏해야 비슷한거 배열길이도 이미 정해진거로 만들어갖고 꾸역꾸역 하나하나  경로부터 이름까지 다 불러와서 배치하는 미친 노가다를 했기 때문이다.

    그런데 이번에 강의를 들어보니 나같이 멍청하게 안하는 방법이 있어서 배운것을 기록하려고 한다.

    1. UI 오브젝트 생성

    UI 작업을 하려면 응당, UI오브젝트가 있어야 하니까 대충 대충 만들어준다.

     

    2. Enum 생성

    그리고 각 Type(Image, Button, Text, ...) 별로 오브젝트 이름을 Enum으로 관리해준다.

    enum Texts
        {
            PointText,
            ScoreText,
        }
    
        enum Buttons
        {
            PointButton,
        }
    
        enum Images
        {
            ItemIcon,
        }

    이런식으로, 난... 저번에 할 때 String Type 배열에 이름 집어넣고 배열 돌려넣어서 다 수동으로했었는데...

    3. Enum 값 받아와서 Object와 매칭

    2번까지 하면 대충 흐름이 보인다.

    오브젝트 이름을 Enum으로 저장해놨으니, 이제 그 값들을 받아와서 자동으로 오브젝트와 스크립트를 매칭시켜주면 될텐데 그걸 어떻게 해야할까?

    우선, Reflection 에 대해서 알아야 할 필요가 있다.

    C#에서 아주 강력한 기능을 하는 것으로...

    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/reflection

     

    Reflection (C#)

    Reflection provides objects that describe assemblies, modules, and types in C#. If your code includes attributes, reflection enables you to access them.

    docs.microsoft.com

    공식문서를 참고하면 좋은데, 사실 나도 아직 대충의 감만 오고 정확하게는 잘 이해를 못한 상황이다.

    런타임 상황에서 클래스나 뭐 그런거의 데이터에 접근하여 값을 얻어올수있다는것,

    그렇기 때문에 우리가 Reflection을 사용해서 Enum Class의 정보를 얻어와서 활용할수있는것이다.

    위의 문서를 해석해보면 그런 상황에 유용하다고 적혀있다.

    따라서 Reflection을 하여 받아온 Enum Class의 정보와 매칭하는 함수를 만들어주면되는데,

    그 코드 전문은 아무래도 강의자료이다보니 저작권 상 전문을 올리기엔 그렇고,

    코드가 어떤 기능을 하는지에 대해 작성해보고자 한다.

    void Bind<T>(Type Type) //Parameter로 Type, Enum Class의 Type을 취득해서 받는다.
    {
    	//1. Parameter로 들어온 Enum Class에 있는 Object의 Name들을 받아와서 String 배열로 저장.
        //2. 1번에서 만든 배열의 길이만큼 UnityEngine.Object 배열을 만들어준다.
        //3. (추후 서술할)Dictionary 에 Key는 Component(ex_ Button, Text, Image)이고 Value는 2번에서 만든 배열 넣어줌
        //4. Hierarchy 에서 오브젝트 이름을 찾아서 2번에서 만들어준 배열과 매칭해준다.
    }

    이러한 기능을 하도록 함수를 만들어주면된다.

    자세한 코드를 알고 싶다면, 인프런에서 Rokiss님의 강의를 수강해보길 추천한다.

    다만, 정말 처음 접하는거라면 강의를 들으면서 이게 뭔 소리인지 헤멜 수 있다.

    내가 그랬어서... 혼자 간단한 프로젝트를 해 보고 유니티에 조금 적응이 된다면 더 많이 얻어갈 강의.

     

    4. Dictionary 로 Data 넣고 빼기

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

    3번에서 언급한 Dictionary이다.

    이렇게 해서 Text Object 배열, Image Object 배열, 등등을 하나의 Dictionary로 관리가능하다.

    Component를 Key로, Object배열을 Value로.

     

    5. Get

    이렇게 오브젝트를 자동으로 매칭시켜놨으면 사용만하면되는데

    그럼 이렇게 저장된 것을 어떻게 갖고오는가? 

    Component Type과 이름을 사용해서 받아오는 함수를 만들어주면 된다.

    Component Type으로 4번에서 만든 Dictionary에 접근해서 Key에 맞는 Value를 빼오고

    그 Value 내에서 이름을 Index Number로 접근하면 되는 것.

     


    강의에서 들은 내용을 제가 이해한대로 흐름상 서술했으며, 중요한 코드는 저작권상 올리지 않았습니다.

    정보 제공글보다는 개인적인 공부글로서 부정확한 정보가 있을 수 있는점 미리 알려드리며, 올바르지 않은 정보의 서술이 있다면 댓글로 알려주시면 감사하겠습니다.