유니티 심화

[UI] 스테이지 페이지 만들기

송현호 2023. 9. 6. 18:03
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;

public class Test03UIStageController : MonoBehaviour
{
    enum eState
    {
        Lock,Doing,Complete
    }

    [SerializeField]
    private GameObject[] stages;
    [SerializeField]
    private Button[] doings;
    [SerializeField]
    private GameObject[] clearStars;
    [SerializeField]
    private TMPro.TMP_Text[] doingTexts;
    [SerializeField]
    private TMPro.TMP_Text[] completeTexts;
    [SerializeField]
    private TMPro.TMP_Text statusStars;

    private int getStars;
    private int totalStars;

    private void Start()
    {
        Init();
        for (int i = 0; i < doings.Length; i++)
        {
            int j = i;
            this.doings[i].onClick.AddListener(() =>
            {
                if (stages[j] == stages[stages.Length - 1])
                {
                    this.stages[j].transform.GetChild(1).gameObject.SetActive(false);
                    this.stages[j].transform.GetChild(2).gameObject.SetActive(true);
                }
                else
                {
                    this.stages[j].transform.GetChild(1).gameObject.SetActive(false);
                    this.stages[j].transform.GetChild(2).gameObject.SetActive(true);

                    this.stages[j + 1].transform.GetChild(0).gameObject.SetActive(false);
                    this.stages[j + 1].transform.GetChild(1).gameObject.SetActive(true);
                }

                InitStars(j);
                StatusStar();

            });
        }
    }
    private void Update()
    {

    }

    private void Init()
    {
        for (int i = 0; i < stages.Length; i++)
        {
            this.stages[i].transform.GetChild((int)eState.Lock).gameObject.SetActive(false);
            this.stages[i].transform.GetChild((int)eState.Doing).gameObject.SetActive(false);
            this.stages[i].transform.GetChild((int)eState.Complete).gameObject.SetActive(false);
            this.stages[i].transform.GetChild((int)eState.Lock).gameObject.SetActive(true);
            doingTexts[i].text = (i+1).ToString();
            completeTexts[i].text = (i+1).ToString();
        }
        this.stages[0].transform.GetChild((int)eState.Lock).gameObject.SetActive(false);
        this.stages[0].transform.GetChild((int)eState.Doing).gameObject.SetActive(false);
        this.stages[0].transform.GetChild((int)eState.Complete).gameObject.SetActive(false);
        this.stages[0].transform.GetChild((int)eState.Doing).gameObject.SetActive(true);

        this.totalStars = stages.Length * 3;
    }

    private void InitStars(int j)
    {
        int random = Random.Range(0, 4);
        switch (random)
        {
            case 0:
                clearStars[j].transform.GetChild(0).gameObject.SetActive(false);
                clearStars[j].transform.GetChild(1).gameObject.SetActive(false);
                clearStars[j].transform.GetChild(2).gameObject.SetActive(false);
                break;
            case 1:
                clearStars[j].transform.GetChild(0).gameObject.SetActive(true);
                clearStars[j].transform.GetChild(1).gameObject.SetActive(false);
                clearStars[j].transform.GetChild(2).gameObject.SetActive(false);
                getStars += 1;
                break;
            case 2:
                clearStars[j].transform.GetChild(0).gameObject.SetActive(true);
                clearStars[j].transform.GetChild(1).gameObject.SetActive(true);
                clearStars[j].transform.GetChild(2).gameObject.SetActive(false);
                getStars += 2;
                break;
            case 3:
                clearStars[j].transform.GetChild(0).gameObject.SetActive(true);
                clearStars[j].transform.GetChild(1).gameObject.SetActive(true);
                clearStars[j].transform.GetChild(2).gameObject.SetActive(true);
                getStars += 3;
                break;
        }
    }

    private void StatusStar()
    {
        statusStars.text = getStars.ToString() +" / "+ totalStars.ToString();
    }

    public int StatusStage()
    {
        return stages.Length; 
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Test03UIPageController : MonoBehaviour
{
    [SerializeField]
    private Button prevArrow;
    [SerializeField]
    private Button nextArrow;
    [SerializeField]
    private GameObject[] pages;
    [SerializeField]
    private TMPro.TMP_Text pageNavi;
    [SerializeField]
    private Test03UIStageController stage;
    

    private float totalPage;
    private int nowPage = 1;
    // Start is called before the first frame update
    void Start()
    {
        this.totalPage = Mathf.CeilToInt(stage.StatusStage() / 18f);

        pageNavi.text = string.Format("{0} / {1}",nowPage,totalPage);

        for (int i = 0; i < totalPage; i++)
        {
            if (pages[i] == pages[0])
            {
                pages[0].SetActive(true);
            }
            else
            {
                pages[i].SetActive(false);
            }
        }

        if(nowPage == 1)
        {
            this.prevArrow.gameObject.SetActive(false);
        }
        prevArrow.onClick.AddListener(() =>
        {
            PrevPage();
            this.nextArrow.gameObject.SetActive(true);
            if (nowPage == 2) {
                this.prevArrow.gameObject.SetActive(false);
            }
            this.nowPage -= 1;
            Debug.LogFormat("현재 페이지 : {0}", nowPage);
            pageNavi.text = string.Format("{0} / {1}", nowPage, totalPage);
        });
        nextArrow.onClick.AddListener(() =>
        {
            NextPage();
            this.prevArrow.gameObject.SetActive(true);
            if (nowPage == pages.Length - 1)
            {
                this.nextArrow.gameObject.SetActive(false);
            }
            this.nowPage += 1;
            Debug.LogFormat("현재 페이지 : {0}", nowPage);
            pageNavi.text = string.Format("{0} / {1}", nowPage, totalPage);
        });

        Debug.LogFormat("현재 페이지 : {0}", nowPage);
        Debug.LogFormat("총 페이지 : {0}", totalPage);
        Debug.LogFormat("총 스테이지 : {0}", stage.StatusStage());

    }

    // Update is called once per frame
    void Update()
    {
        
    }

    private void NextPage()
    {
        this.pages[nowPage-1].SetActive(false);
        this.pages[nowPage].SetActive(true);
    }

    private void PrevPage()
    {
        this.pages[nowPage-1].SetActive(false);
        this.pages[nowPage - 2].SetActive(true);
    }


}

 

본래 의도는 스테이지 / 스테이지 컨트롤러 / 페이지 컨트롤러로 세분화하여 스크립트를 작성하려고 했으나 어쩌다보니 스테이지 컨트롤러와 페이지 컨트롤러에서 전부 해결하게 되었다. 저장과 기능은 정상적으로 동작하겠지만 좀 더 객체지향적으로 코드를 작성하려고 노력해야겠다.