UI 자동화(1)

개발조하·2023년 12월 2일
0

Unity

목록 보기
14/30
post-thumbnail

1. UI_Button 클릭 시 score 증가 기능

UI 오브젝트를 클릭했을 경우에도 InputManager의 MouseAction이 진행되는 것을 수정.

  • Button UI 생성

  • UI_Button.cs 생성

public class UI_Button : MonoBehaviour
{
    [SerializeField]
    Text _text;
    int score = 0;

    public void OnButtonClicked()
    {
        score++;
        _text.text = $"점수 : {score}";
    }
}
  • 점수 Text 연결
  • Button 클릭 이벤트 추가

-> 버튼 클릭 시 점수가 증가하는 시스템을 만들었다! 하지만, 실제 게임을 제작할 때에는 수많은 UI가 필요하기 때문에 매번 이렇게 인스펙터에서 이벤트를 드래그앤드롭으로 추가해줄 수는 없다... 자동화 시스템이 필요하다!

2. UI 자동화 (1)

2.1 UI 오브젝트의 이름을 찾아서 자동 맵핑 시키기 : Bind()

💡enum 사용

사용할 UI 오브젝트를 종류별로 enum을 사용하여 이름을 열거한다.

💡Reflection 기능 사용

: enum 타입으로 열거해둔 이름들을 Bind함수에 타입으로 넘겨준다.

💡제네릭 사용

: Buttons와 Texts 산하에 있는 이름과 일치하는 오브젝트를 찾아서 연결해줘야 한다.
1) 이름이 일치하고,
2) Button/Text라는 컴포넌트를 가진 오브젝트를 찾아라!
-> 제네릭으로 해당 오브젝트가 갖고있어야 할 컴포넌트 알려줌

💡Enum.GetNames(type)

: enum 값들을 string 타입의 배열로 반환

💡Dictionary<Type, UnityEngine.Object[]>

: 현재 서로 다른 타입인 Button과 Text를 찾아야 한다. 타입이 다른 문제는 Unity에서 사용하는 모든 오브젝트의 최상위 조상인 Object를 사용하여 해결할 수 있다.
-> 이렇게 찾은 각 타입의 오브젝트 배열을 Dictionary를 사용하여 리스트로 정리해둔다.

  • Type에 따라 Dictionary에 넣을 공간 확보

💡 Util.cs 사용

: 찾기 등의 기능성 함수들을 모아두는 별도 스크립트를 하나 생성하여 관리한다.

  • Util.cs에서 만들어준 FindChild()를 UI_Button.cs의 Bind()에서 사용하여 오브젝트를 찾는다.

  • Util.FindChild() 코드 작성
    Component.GetComponentsInChildren : 내 자식들이 갖고 있는 T타입의 컴포넌트를 모두 스캔해주는 Unity 자체 함수

  • Util.GetOrAddComponent() 코드
    ㄴ 객체별로 인스펙터에서 컴포넌트를 직접 연결할 필요 없이 코드로 연결하기.

💡 Bind()한 객체 꺼내기 : Get()

Bind()함수를 통해 찾은 일치한 object의 인덱스 번호를 Get()을 활용하여 꺼낸다. 즉, 원하는 객체를 불러와 해당 객체의 데이터를 바꿔준다.
-> 매번 인스펙터에 필요한 UI객체를 드래그앤드롭으로 연결해주지 않아도 된다!!

📄참고자료
[인프런] c#과 유니티로 만드는 MMORPG 게임 개발 시리즈
Reflection 기능
Component.GetComponentsInChildren

profile
Unity 개발자 취준생의 개발로그, Slow and steady wins the race !

0개의 댓글