[UNITY]/TIL: UNITY

PlayerPrefs 응용에 응용하기....

네,가능합니다 2024. 9. 12. 15:11

아래는 TIL이자 발표자료 준비를 하며 작성한 글이다.

 

PlayerPrefs를 이용한 기능은 아래와 같다.

게임을 끝낼때마다 랜덤으로 지정해둔 카드중 한개를 지급하고 어떤카드를 획득했는지 알림을 주고
메인메뉴에 "획득한 카드들" 에 해당 카드가 보임.

중요한것은 "랜덤", "알림 및 획득한 카드", "게임을 다시 접속해도 유지될것" 입니다.

로직의 작동 순서는 아래와 같습니다.

    public void RandomCard()// 랜덤카드선택 및 획득카드알림, 수집상태 저장
    {
        int randomIndex = Random.Range(0, cardImages.Length); //0에서 배열의 크기 사이의 숫자를 랜덤으로 하나 선택
        Sprite selectedCard = cardImages[randomIndex]; // 선택한 숫자를 넣어 그 카드의 sprite를 저장

        // NotificationManager를 통해 알림 표시 
        if (NotificationManager.Instance != null)
        {
            NotificationManager.Instance.ShowNotification(selectedCard); // 위에서 저장한 sprite를 알림판넬에 전달
        }

        PlayerPrefs.SetInt("CollectedCard_" + randomIndex, 1); // PlayerPrefs 를 이용해서 해당카드번호를 저장
        PlayerPrefs.Save();
    }   

다음으로는 획득한 카드 알림부분 입니다.
    public void ShowNotification(Sprite cardImage) // 카드획득 알림
    {
        notificationCardImage.sprite = cardImage; // 이전에 RandomCard()함수에서 받아온 Sprite가 notificationCardImage.sprite에 들어감
        notificationPanel.SetActive(true); // 미리 만들어둔 판넬을 켜주고 
        StartCoroutine(HideNotificationAfterDelay(3f)); // 여기부터 아래까지는 코루틴을 이용한 3초 딜레이주기
    }
    private IEnumerator HideNotificationAfterDelay(float delay) 
    {
        yield return new WaitForSeconds(delay); // 위에서 작성한 3초만큼 기다렸다가 다음코드 진행
        notificationPanel.SetActive(false); // 판넬끄기
    }

그리고 마지막으로 메인메뉴에서 획득한 카드를 플레이어가 볼 수 있게 하는 로직입니다.


    public void UpdateCardSlots() // PlayerPrefs에 저장되어있는 획득한 카드번호에 맞게 메인메뉴에 해당 슬롯 활성화
    {
        for (int i = 0; i < cardSlots.Length; i++) // 반복문을 통해 카드슬롯의 수만큼 하나씩 확인함
        {
            if (PlayerPrefs.GetInt("CollectedCard_" + i, 0) == 1) // 확인중에 해당슬롯이 보유중이라면
            {
                cardSlots[i].sprite = cardImages[i]; // 해당카드이미지를 해당 sprite에 설정하고
                cardSlots[i].gameObject.SetActive(true); // 활성화
            }
            else // 보유하지않으면
            {
                cardSlots[i].gameObject.SetActive(false); // 비활성화
            }
        }
    }

 

이렇게 지금은 정리가 잘 된 코드이지만 사실 중간에 버그가 생겨 엄청나게 고생을 했다.

 

버그는 이랬다

 

1.게임을 실행했을때 = 획득했던 카드들이 잘 나옴

 

2. 게임을 클리어했을때 = 카드획득 잘됨 저장도 잘됨

 

3. 메인메뉴로 돌아갔을때 = 획득했던 카드가 보이지않고 오류메세지 도배

 

그후 1 > 2 > 3 > 1 > 2 > 3 반복

 

원인은 이랬다. 원래 획득했던 카드를 불러오는 스크립트를 StartManager.cs 에 넣어뒀었는데,해당 스크립트는 다른 기능도 함께했기에 씬을 옮겨다니면 파괴가 되었고 파괴가 되면서 원래 직접 지정해두었던 sprite들이 없어져서 획득한 카드를 활성화 해주지 못했던것이다.

 

해결방법은 두가지가 있었다. (같은팀 팀원 보훈님이 도와주심ㅜㅜ)스타트씬에서만 작동하는 새로운 스크립트에 넣어주는것과 해당 Sprite들을 코드를 통해 파괴되어도 다시 생겼을때 알아서 받아오는것

 

당연하게도 아주 간단하게 스타트씬에서만 작동하는 새로운 스크립트에 해당 코드를 넣어주어 해결했다 ~