본문 바로가기
Unity/수업과제

[Unity] AddListener와 for문

by 왹져박사 2023. 2. 6.
728x90

2023.02.06 - [Unity/수업내용] - [Unity UI] 1일차 Button

 

[Unity UI] 1일차 Button

btnBlue는 Main에서 직접 이벤트를 관리, btnYellow와 btnGreen은 Button들을 관리하는 UIButtons에서 이벤트를 관리하는 방법으로 코드를 작성하였다. UIButtons using System.Collections; using System.Collections.Generic; usi

narmhye.tistory.com

이전 글에서 있었던 문제의 원인을 찾아보았다. 

 

문제가 발생한 코드

UIButtons의 Start

    private void Start()
    {
        for(int i = 0; i < arrBtns.Length; i++)
        {
            this.arrBtns[i].onClick.AddListener(() =>
            {
                this.onClick((eBtnTypes)i);
            });
        }
    }

ButtonsSceneMain의 Start

    void Start()
    {
        this.uiButtons.onClick = (btnType) =>
        {
            Debug.Log(btnType);
        };
    }

(생각)

ButtonsSceneMain에서 UIButtons를 참조하고 있어

UIButtons의 Start 부분이 먼저 실행된 후에 참조되어 btnType변수에 저장된다고 생각한다. 

( ButtonsSceneMain -UIButtons 참조 - for문 - btnType출력 )

이때, for문이 다 돌고 난 후 i가 참조되어 반복문의 종료 시점의 i++(3)이 출력된것이 아닐까 싶다.

 

(해결방법)

따라서, 종료시점의 i가 아닌 for문이 시행되고 있을 때, 각 i마다 새로운 지역변수를 받아 저장한다면 

이벤트가 발생할 당시의 변수가 전해지기 때문에 원하던 출력물을 얻을 수 있었다. 

 

    private void Start()
    {
        for(int i = 0; i < arrBtns.Length; i++)
        {
            int typeN = i;
            this.arrBtns[typeN].onClick.AddListener(() =>
            {
                this.onClick((eBtnTypes)typeN);
            });
        }
    }

 

728x90