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);
}
}
본래 의도는 스테이지 / 스테이지 컨트롤러 / 페이지 컨트롤러로 세분화하여 스크립트를 작성하려고 했으나 어쩌다보니 스테이지 컨트롤러와 페이지 컨트롤러에서 전부 해결하게 되었다. 저장과 기능은 정상적으로 동작하겠지만 좀 더 객체지향적으로 코드를 작성하려고 노력해야겠다.
'유니티 심화' 카테고리의 다른 글
[UI] 스크롤뷰 (0) | 2023.09.07 |
---|---|
[UI] 로그인 창 만들기 (0) | 2023.09.05 |
[UI] 슬롯에서 영웅 생성하기 + 데이터 연동 (0) | 2023.09.01 |
(수정중) 유니티 New Input System 사용하여 이동 구현 (0) | 2023.09.01 |
유니티 new Input System으로 조이스틱 사용하기 (0) | 2023.08.31 |