버튼에 이벤트를 연결시키는 간단한 방법입니다.

처음에 개발할때는 버튼 30개에 일일이 하나씩 지정해 줬었는데, 아놔 노가다가 노가다가 이런 일이 없어요. 

간혹가다가 멘붕와서 하나라도 빠지면 ㅠㅠ 짜증 만땅나요.

그래서 코드로 직접 이벤트 리스너를 등록하는 신공을 익혔지요.

구현 코드는 정말 간단해요. 이걸 아니까 예전에 왜 그렇게 했지. 머리가 나쁘면 손과 눈이 고생이라는걸...



자 요런식으로 스테이지를 구성할때 리스트 뷰에다가 버튼을 동적으로 생성해서 넣고 저 버튼을 누를때 누른 스테이지를 콜 하는 방법 수많은 게임에서 주로 사용하는 방식이지요.






제가 실제 게임에 사용한 코드전체입니다. (전문가 분들은 멍멍이 발로 코딩했니 이런소리 할수도 있지만 그냥 그러려니 넘겨주세요 ㅋㅋㅋ)


using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;

using UnityEngine.SceneManagement;


public class StageScene : MonoBehaviour {


    public Sprite Locked;

    public Sprite Unlocked;

    public ScrollRect scrollRect;

    private int maxStage;


    // Use this for initialization

    void Start () {

        SoundManager.instance.PlayBgm(2);

        maxStage = 30;

        initStages();

    }


    private void OnDestroy()

    {

        //for (int i = 1; i <= nbOfStages; i++)

        //{

        //    scrollRect.content.GetChild(i).GetComponent<Button>().onClick.RemoveListener(() => StageButtonClickListener(i));

        //}

    }


    public void BackToMainScene()

    {

        SceneManager.LoadScene("MainScene");

    }


    private void initStages()

    {

        int nextStage = PlayerPrefs.GetInt("NextStage", 1);

        Button toInstance = Resources.Load<Button>("Prefabs/StageButton");


        Vector3 nextPosition = new Vector3(0, 0, 0);

        for (int i = 1; i <= maxStage; i++)

        {

            Button stage = Instantiate(toInstance, nextPosition, Quaternion.identity, scrollRect.content.transform);

            stage.transform.GetChild(0).GetComponent<Text>().text = i.ToString();

            stage.transform.localPosition = nextPosition;


            int id = i;


            // add listener

            stage.onClick.AddListener(() => StageButtonClickListener(id));


            if (i <= nextStage)

            {

                stage.image.overrideSprite = Unlocked;

                stage.transform.GetChild(0).GetComponent<Text>().gameObject.SetActive(true);

            }

            else

            {

                stage.image.overrideSprite = Locked;

                stage.transform.GetChild(0).GetComponent<Text>().gameObject.SetActive(false);

            }


            // Next position

            if (i % 6 == 0)

            {

                nextPosition.x = 0;

                nextPosition.y -= 130;

            }

            else

            {

                nextPosition.x += 130;

            }

        }


        RectTransform boundary = (RectTransform)scrollRect.content.transform;

        boundary.sizeDelta = new Vector2(780, nextPosition.y * (-1) + 130);

    }


    void StageButtonClickListener(int stage)

    {

        if (stage <= PlayerPrefs.GetInt("NextStage", 1))

        {

            PlayerPrefs.SetInt("CurrentStage", stage);

            SceneManager.LoadScene("StageScene" + stage.ToString());

        }

    }


}



버튼에 이벤트 넣는 부분은 붉은색 마킹해 놓았어요. 한번 보시면 이해가 빠르실꺼에요.

요렇게 개발하면 저 위에 캡쳐한 화면처럼 나온답니다. ^^