Unity UI Button onClick.AddListener 활용하기

 

 

#. 버튼에 이벤트 할당하기

유니티에서 UI에 동작을 할당 할 때는 간편하게 인스펙터에서

버튼 컴포넌트에 노출되어있는 UnityEvent에 할당하는 방법이 있다.

 

쉽고 간편해서 많은 유니티 튜토리얼에서 사용되는 방법이지만,

이 방법은 두 가지 단점이 있다.

 

1. 할당된 메서드가 visual studio에서 레퍼런스 참조가 안되며,

2. 미리 할당해놔야하기 때문에 동적으로 버튼의 동작을 바꿀 수 없다

 

 

#. AddListener로 버튼에 이벤트 할당하기

때문에 이를 해결하기 위해 Button에 onClick.AddListener(델리게이트) 형식으로 메서드를 할당하는 방법이 있다.

 

1. 인자가 없는 메서드 예시

void Awake()
{
    // 인자가 없는경우 바로 메소드 이름으로 넘겨주면됨.
    button.onClick.AddListener(PressBtnClose);
}
    
void PressBtnClose() // 인자가 없는 메소드
{
}

2. 인자가 있는 메서드 예시

void Awake()
{
    // 인자가 있는 경우 람다 식이나 델리게이트를 사용
    button.onClick.AddListener(() => OpenTab(0));
    button.onClick.AddListener(delegate { OpenTab(0); });
}

void PressBtnTab(int tabIndex) // 인자가 있는 메소드
{
}

 

#. 주의사항

for 문 루프 + 람다식으로 Add Listener를 할 경우, 클로저 문제가 발생하여 제대로 할당이 되지 않을 우려가 있다.

아래의 글을 참조할 것.

 

for 문에서 AddListener 람다식은 주의해야한다. (AddListener for loop)

# 문제는 무엇인가? 버튼을 배열로 선언해놓고 for문에서 AddListener로 할당하려고 했는데, 모두 마지막 값으로 초기화되는 현상이 있었다. for (int i = 0; i < Btns.Length; i++) { Btns[i].onClick.AddListene..

mentum.tistory.com

 

댓글

Designed by JB FACTORY