
foreach를 사용한 스크립트의 일부분이다.
스테이지 버튼관련되서 활성화 비활성화를 위해 사용한 부분이다.
foreach (var sb in stageButtons)
{
bool unlocked = (sb.stageNumber == 1)
|| PlayerPrefs.GetInt("StageUnlocked_" + (sb.stageNumber - 1), 0) == 1;
// 보이기/숨기기
sb.button.gameObject.SetActive(unlocked);
sb.button.interactable = unlocked;
if (unlocked)
{
// 클릭 리스너 등록 (중복 방지)
sb.button.onClick.RemoveAllListeners();
sb.button.onClick.AddListener(() => LoadStage(sb.stageNumber));
}
}
이 코드는 여러 개의 스테이지 버튼(stageButtons)을 돌면서, 각 버튼이 "잠금 해제" 상태인지 확인하고, 잠금이 풀렸으면 버튼을 보이게 하고 클릭할 수 있도록 만들어준다. 그리고 버튼을 눌렀을 때 해당 스테이지로 이동하는 기능도 추가해준다.
1. foreach (var sb in stageButtons)
뜻: stageButtons라는 여러 개의 버튼 목록에서 하나씩(sb) 꺼내서 반복문을 돌린다는 뜻.
여기서 sb는 stageButtons의 축약이다.
예시: 버튼이 5개라면, 이 코드는 5번 반복돼요. sb는 각각의 버튼을 가리킨다.
bool unlocked = (sb.stageNumber == 1) || PlayerPrefs.GetInt("StageUnlocked_" + (sb.stageNumber - 1), 0) == 1;
뜻 : 이 줄은 스테이지가 해금이 되었는지 여부를 판단하는 줄이다.
sb.button.gameObject.SetActive(unlocked);
뜻: unlocked가 true(열려있음)이면 버튼을 화면에 보이게 하고, false(잠겨있음)이면 안 보이게 한다.
if (unlocked)
{
// 클릭 리스너 등록 (중복 방지)
sb.button.onClick.RemoveAllListeners();
sb.button.onClick.AddListener(() => LoadStage(sb.stageNumber));
}
뜻 : unlocked가 true(즉, 버튼이 열려있을 때)만 아래 코드를 실행한다.
sb.button.onClick.RemoveAllListeners();
뜻: 중복 등록을 방지하기 위해 이 버튼에 이미 등록된 클릭 이벤트(리스너)를 모두 지운다.
sb.button.onClick.AddListener(() => LoadStage(sb.stageNumber));
뜻: 버튼을 클릭하면 LoadStage라는 함수를 실행해서, 해당 스테이지로 이동하게 하는 것이다.
sb.stageNumber : 현재 버튼이 어떤 스테이지인지 알려주는 번호.
OnDestroy()함수
예시 스크립트
private void OnDestroy()
{
instance.normalBGM = normalBGM;
instance.warningBGM = warningBGM;
instance.Retry = Retry;
instance.fastImage = fastImage;
instance.normalImage = normalImage;
instance.slowImage = slowImage;
instance.isWarningBGMPlaying = isWarningBGMPlaying;
//instance.currentStageIndex = currentStageIndex;
instance.totalStageCount = totalStageCount;
instance.selectPanel = selectPanel;
instance.progress = progress;
instance.firstCard = firstCard;
instance.secondCard = secondCard;
instance.timeTxt = timeTxt;
instance.ComboTxt = ComboTxt;
instance.Combo = Combo;
instance.cardCount = cardCount;
instance.startTime = startTime;
instance.time = time;
instance.gameOverTriggered = gameOverTriggered;
instance.Win = Win;
if(curBoard != null)
{
instance.curBoard = curBoard;
instance.setCardTime = instance.curBoard.cardTotalTime;
}
instance.stageButtons = stageButtons;
instance.isFirstSetStageBtn = isFirstSetStageBtn;
}
OnDestroy()는 유니티에서 오브젝트가 삭제될 때(파괴될 때) 자동으로 실행되는 함수이다.
예를 들어, 씬이 바뀌거나 오브젝트를 Destroy()로 지웠을 때 호출된다.
예시)GameManager
예를 들어서 말하면 A라는 오브젝트가 곧 사라질것인데, 이 안의 중요한 정보들을 instance라는 저장소에 미리 복사해 두는것을 말한다.
사용하는 이유
GameManager는 싱글톤(게임 전체에서 딱 하나만 존재하는 관리자)으로 설계되어 있다.
씬이 바뀔 때, GameManager 오브젝트가 새로 만들어지거나 사라질 수 있는데,
중요한 정보들이 날아가지 않게 instance에 미리 저장해두는 것이다.
이렇게 하면, 씬이 바뀌어도 instance에 저장된 정보로
게임의 상태를 이어갈 수 있다.
미니프로젝트 작업물
오늘 미니프로젝트에서 작업한 내용은 기존의 개인 작업물이었던 StageSelectManager의 기능을 GameManager에 병합하는 작업을 했다.
후기
처음보는 코드와 함수, 변수가 많아서 하나하나 찾아가면서 작성을 해본거 같다. 다른 팀원이 작성한 새로운 코드들을 인터넷과 검색도구들을 사용해서 어떤용도인지, 정의가 어떤지를 찾아보면서 이해하는 과정이 주인 하루였던거 같다. 그리고 미니 프로젝트를 진행하면서, 각자가 작업한 작업물을 Git의 branch를 이용해서 병합하는 과정에서 일어나는 오류들을 하나하나 잡아가고, 각 branch에서 잡은 오류들을 main branch에서 다시 병합해서 오류를 잡고 하나하나 실행해가면서, 의도했던대로 동작하는지 확인하고, 의도한대로 움직이지 않으면 다시 코드를 수정하는 과정을 진행해갔다. 그 과정에서 처음 알게되는 코드도 굉장히 많았고, 의견을 조율하면서 진행하는 협업 코딩이 어떤것인지 맛을 본거 같은 기분이 들었다.
#내일배움캠프 #스파르타내일배움캠프 #스파르타내일배움캠프TIL