내일 배움 캠프 첫 과제는 카드 뒤집기를 만드는 것이다. Ranking판을 만드는 작업을 하였고, Ranking판의 로직에 맞게 작업을 하였다.
RankingManager과 PlayerPref을 활용한 데이터 저장
RankingManager을 만들고, PlayerPref을 사용하여 데이터를 저장한다.
아쉽지만 PlayerPref에서 어레이 형태로 저장되지 않아, 다음과 같이 GenKey를 짠 후, 작업을 하였다.
public string GenKey(int index)
{
return ScoreTemplate + index.ToString();
}
이코드로, 이름을 입력하는대신, 함수에 인덱스를 넣어 값을 저장하거나 찾으면 된다.
반면 스코어를 ClearScene에서 가져 올 때 값들을 비교 해 주기위해, 다음과 같은 코드를 사용한다.
public bool CheckHigh(float score)
{
for (int i = 0; i < RankingMaxSize; i++)
{
if (!PlayerPrefs.HasKey(GenKey(i)) || score < PlayerPrefs.GetFloat(GenKey(i)))
return true;
}
return false;
}
이는 점수를 받고, 만약 키에 저장된 값이 없거나, 해당 점수가 저장된 값보다 작다면 true를, 아니면 랭킹 권 밖이므로 false를 반환한다.
이제 이 값을 순서대로 정리 해 주기 위하여, 다음과 같이 활용한다.
public void AddScore(float score)
{
int size = 0;
while(PlayerPrefs.HasKey(GenKey(size)) && size < RankingMaxSize)
size++;
int last_index;
if (size < RankingMaxSize)
{
PlayerPrefs.SetFloat(GenKey(size), score);
last_index = size;
}
else
{
PlayerPrefs.SetFloat(GenKey(RankingMaxSize - 1), score);
last_index = RankingMaxSize - 1;
}
while (last_index > 0)
{
float f = PlayerPrefs.GetFloat(GenKey(last_index-1));
float b = PlayerPrefs.GetFloat(GenKey(last_index));
if (b < f)
{
PlayerPrefs.SetFloat(GenKey(last_index - 1), b);
PlayerPrefs.SetFloat(GenKey(last_index), f);
last_index--;
}
else
break;
}
}
for문에서 무한루프 돌아가서 잠시 고생했었다.
아쉽게도 PlayerPref이 array를 저장 못하기 때문에, 지금 저장된 값들 수를 직접 확인 해 주어야 한다. 지금 와서 생각해보면 사이즈를 저장 해도 됬을 것 같지만...
그 사이즈에 따라 제일 뒤 (빈칸일수도 있고, 아닐 수도 있다.) 에 받은 스코어를 넣어준다.
그 후 인덱스를 줄여나가며, 전값과 뒷값을 비교하여 현재 값이 더 작다면, 바꿔 준 뒤 한칸 씩 앞으로 나가면 된다. 버블 정렬(bubble sort)의 일종이지만, 실은 데이터가 적으며, 앞 배열이 이미 정렬되어 있어 이 예시에서는 효율적이다. 만약 크다면 자리를 전부 찾았으므로, 멈춰주면 된다.
이제 RankingBoard라는 스크립트에 해당 값을 찾아, 해당 위치에 넣어주면 된다.
스크립트에서 RectTransform의 사이즈를 변경하고 싶을 경우가 있을것이다. 하지만 RectTransform은 선택한 프리셋에 따라 입력하는 방식이 다르므로, 이를 해결할 방법을 찾아보았다.
나는 가로값은 고정, 세로 값은 변경을 해 주고 싶었다. 해당 코드를 보자.
RectTransform rt = canvas.GetComponent<RectTransform>();
rt.sizeDelta = new Vector2 (rt.sizeDelta.x, 100);
RectTransform은 transform의 localscale이 아닌 sizeDelta라는것을 가져온다. 이것을 활용하여, 실제 크기를 각 상황에 대입시켜 작업 해 줄 수 있다.
추가적으로 하고 싶어 파티클 작업을 해 주었다. 랭킹판에 기록이 있다면, 폭죽을 쏴 주는 방식이다.
파티클을 있는 에셋으로 겨우 겨우 제작했다. 컴포넌트가 많아서 알아낸 것 위주로만 적자.
파티클을 만들고, 생성을 해 주려 했는데, UI가 위에 가려서, 파티클이 보이지 않는 문제가 발생하였다.
찾아보니 해결방법 중 하나는 다음과 같다.
이러면 Main Camera위 UI카메라가 UI카메라 자식에 있는 내용들을 송출해 준다. 참고로 Camera생성시 Audio Listener이 생기므로, 하나만 남기고 다 지워주다 (Main거 남기고 지우면 된다.)
이렇게 해서 파티클 생성을 해 보았다. 어찌저찌 하다보니 되긴 했는데, 다음 시간에 플레이 영상이 생긴다면, 올려드리겠다.