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}";
}
}
-> 버튼 클릭 시 점수가 증가하는 시스템을 만들었다! 하지만, 실제 게임을 제작할 때에는 수많은 UI가 필요하기 때문에 매번 이렇게 인스펙터에서 이벤트를 드래그앤드롭으로 추가해줄 수는 없다... 자동화 시스템이 필요하다!
사용할 UI 오브젝트를 종류별로 enum을 사용하여 이름을 열거한다.
: enum 타입으로 열거해둔 이름들을 Bind함수에 타입으로 넘겨준다.
: Buttons와 Texts 산하에 있는 이름과 일치하는 오브젝트를 찾아서 연결해줘야 한다.
1) 이름이 일치하고,
2) Button/Text라는 컴포넌트를 가진 오브젝트를 찾아라!
-> 제네릭으로 해당 오브젝트가 갖고있어야 할 컴포넌트 알려줌
: enum 값들을 string 타입의 배열로 반환
: 현재 서로 다른 타입인 Button과 Text를 찾아야 한다. 타입이 다른 문제는 Unity에서 사용하는 모든 오브젝트의 최상위 조상인 Object를 사용하여 해결할 수 있다.
-> 이렇게 찾은 각 타입의 오브젝트 배열을 Dictionary를 사용하여 리스트로 정리해둔다.
: 찾기 등의 기능성 함수들을 모아두는 별도 스크립트를 하나 생성하여 관리한다.
Util.cs에서 만들어준 FindChild()를 UI_Button.cs의 Bind()에서 사용하여 오브젝트를 찾는다.
Util.FindChild() 코드 작성
ㄴ Component.GetComponentsInChildren : 내 자식들이 갖고 있는 T타입의 컴포넌트를 모두 스캔해주는 Unity 자체 함수
Util.GetOrAddComponent() 코드
ㄴ 객체별로 인스펙터에서 컴포넌트를 직접 연결할 필요 없이 코드로 연결하기.
Bind()함수를 통해 찾은 일치한 object의 인덱스 번호를 Get()을 활용하여 꺼낸다. 즉, 원하는 객체를 불러와 해당 객체의 데이터를 바꿔준다.
-> 매번 인스펙터에 필요한 UI객체를 드래그앤드롭으로 연결해주지 않아도 된다!!
📄참고자료
[인프런] c#과 유니티로 만드는 MMORPG 게임 개발 시리즈
Reflection 기능
Component.GetComponentsInChildren