인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

SeongBaek CHO님의 프로필 이미지

작성한 질문수

책 3권을 영상으로 만든 유니티 게임 개발

아이템 구매 및 코인 데이터 갱신

Knight구매시 오류

작성

·

96

·

수정됨

1

using UnityEngine;
using UnityEngine.UI;

public class ItemPurchase : MonoBehaviour
{
    [SerializeField] UnitObject[] unitObjects;
    [SerializeField] int ItemNumber;
    [SerializeField] int ItemPrice;
    [SerializeField] GameObject BlackPanel;
    [SerializeField] GameObject PurchasePanel;
    [SerializeField] GameObject AlarmPanel;
    [SerializeField] Text AlarmText;
    [SerializeField] Text UnitName;
    [SerializeField] Image UnitImg;
    
    int CurrentCoin = 0;

    [HideInInspector] public static ItemPurchase Instance;

    void Awake()
    {
        Instance = this;
        Debug.Log("1. Saved ItemNumber" + PlayerPrefs.GetInt("ItemNumber"));

    }

    void Start()
    {
        PlayerPrefs.SetInt("Coin", 10000000);
        PlayerPrefs.Save();
        Debug.Log("2. Saved ItemNumber" + PlayerPrefs.GetInt("ItemNumber"));
        CurrentCoin = PlayerPrefs.GetInt("Coin");
    }

    public void SelectItem()
    {
        PlayerPrefs.SetInt("ItemNumber", ItemNumber);
        PlayerPrefs.Save();

        BlackPanel.SetActive(true);
        PurchasePanel.SetActive(true);

        UnitName.text = unitObjects[ItemNumber-1].UnitName;
        UnitImg.sprite = unitObjects[ItemNumber-1].UnitImg;
        Debug.Log("3. Saved ItemNumber" + PlayerPrefs.GetInt("ItemNumber"));
        Debug.Log("4. Selected Item Number : " + ItemNumber);
    }

    public void PurchaseItemBtn()
    {
        if(CurrentCoin < ItemPrice)
        {
            AlarmPanel.SetActive(true);
            AlarmText.text = "코인이 부족합니다.";
            return;
        }

        AlarmPanel.SetActive(true);
        AlarmText.text = "구매를 완료했습니다.";


        Debug.Log("5. Saved ItemNumber" + PlayerPrefs.GetInt("ItemNumber"));
        Debug.Log("6. Selected Unit" + (ItemNumber+3));
        Debug.Log("7. Selected Price : " + ItemPrice);
        PlayerPrefs.SetInt("Unit"+(ItemNumber + 3), 1);
        PlayerPrefs.SetInt("Coin", CurrentCoin - ItemPrice);

        PlayerPrefs.Save();

    }

    public void PurchasePanelOffBtn()
    {
        BlackPanel.SetActive(false);
        PurchasePanel.SetActive(false);

        PlayerPrefs.DeleteKey("ItemNumber");
    }
}
using UnityEngine;
using UnityEngine.UI;

public class PurchaseBtn : MonoBehaviour
{
    [SerializeField] Button purchase_btn;
    
    void Start()
    {
        purchase_btn.onClick.AddListener(OnClickBtn);
    }

    private void OnClickBtn()
    {
        ItemPurchase.Instance.PurchaseItemBtn();
    }
}

강의 따라했는데, 나이트 구매시 인스턴스 this가 super defender로 잡혀서 구매가 되는데 어떻게 해야하나요? 싱글턴 패턴에서 수퍼 디펜더가 처음에 잡혀서 나이트가 static 인스턴스에의해 못 잡고있는 것 같기도한데... 어디서부터 봐야할지 모르겠어요ㅠ

스크린샷 2025-02-28 오전 12.53.26.png.webp

 

답변 2

1

JEngineer님의 프로필 이미지
JEngineer
지식공유자

질문 감사합니다!

 

ItemNumber 변수를 인스펙터 창에서 어떤 값을 삽입했는지부터 알 수 있을까요?

만약에 제대로 설정이 되었다면 다른 문제인지 한번 찾아보겠습니다!

JEngineer님의 프로필 이미지
JEngineer
지식공유자

asd.png.webp

Unit4Button, Unit5Button에 부착되어 있는 ItemPurchase 스크립트의 UnitObjects에 스크립터블 오브젝트가 각각 제대로 부착되어 있는지도 확인해주시면 감사하겠습니다!

SeongBaek CHO님의 프로필 이미지
SeongBaek CHO
질문자

스크린샷 2025-02-28 오전 9.16.39.png.webp

 

스크린샷 2025-02-28 오전 9.16.22.png.webp

 

 

혹시 틀렸나요...?ㅎㅎ

JEngineer님의 프로필 이미지
JEngineer
지식공유자

public void PurchaseItemBtn()
    {
        ItemNumber = PlayerPrefs.GetInt("ItemNumber");

        if (CurrentCoin < ItemPrice)
        {
            AlarmPanel.SetActive(true);
            AlarmText.text = "코인이 부족합니다.";
            return;
        }

        AlarmPanel.SetActive(true);
        AlarmText.text = "구매를 완료헸습니다.";

        PlayerPrefs.SetInt("Unit" + (ItemNumber + 3), 1);
        PlayerPrefs.SetInt("Coin", CurrentCoin - ItemPrice);
        PlayerPrefs.Save();
    }

 

PurchaseItemBtn 메소드에 ItemNumber = PlayerPrefs.GetInt("ItemNumber") 코드를 가장 윗 줄에 추가해서 ItemNumber 변수에 한번더 값을 삽입하는 방법도 좋습니다!

SeongBaek CHO님의 프로필 이미지
SeongBaek CHO
질문자

    public void SelectItem()
    {
        PlayerPrefs.SetInt("ItemNumber", ItemNumber);
        PlayerPrefs.SetInt("ItemPrice", ItemPrice);
        PlayerPrefs.Save();

        BlackPanel.SetActive(true);
        PurchasePanel.SetActive(true);

        UnitName.text = unitObjects[ItemNumber-1].UnitName;
        UnitImg.sprite = unitObjects[ItemNumber-1].UnitImg;
    }

    public void PurchaseItemBtn()
    {
        ItemNumber = PlayerPrefs.GetInt("ItemNumber");
        ItemPrice = PlayerPrefs.GetInt("ItemPrice");

        if(CurrentCoin < ItemPrice)
        {
            AlarmPanel.SetActive(true);
            AlarmText.text = "코인이 부족합니다.";
            return;
        }

        AlarmPanel.SetActive(true);
        AlarmText.text = "구매를 완료했습니다.";

        PlayerPrefs.SetInt("Unit"+(ItemNumber + 3), 1);
        PlayerPrefs.SetInt("Coin", CurrentCoin - ItemPrice);

        PlayerPrefs.Save();

    }

 

이렇게 PlyaerPrefs에 아이템 넘버와 코인 가격 저장해서 호출하게끔 변경했네요. 코인가격도 이렇게 하면되는거죠??

JEngineer님의 프로필 이미지
JEngineer
지식공유자

그렇게 하셔도 상관없습니다!

PlayerPrefs를 자주 활용하시면 인게임 데이터 관리에 유용하기 때문에 자주 활용하시는 걸 추천드립니다!

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. SeongBaek CHO님.

현재 유니티 게임 개발 중, ItemPurchase 스크립트에서 아이템 구매와 관련된 문제가 발생하여 어려움을 겪고 계신 것 같습니다. 문제는 Instancesuper defender로 잘못 설정되어 나이트 구매가 올바르게 이루어지지 않는다는 점인데요. 이 경우 싱글턴 패턴이 잘못 구성되었거나, 다른 이유로 Instance가 제대로 초기화되지 않았을 가능성이 있습니다. 아래 몇 가지 점검 사항을 안내드립니다:

  1. 싱글턴 초기화 확인: Awake() 메서드 내에서 Instancethis로 설정하셨는데, 이 경우 ItemPurchase 클래스가 제대로 초기화되었는지 확인해야 합니다. Instance가 정확히 한 번만 설정될 수 있도록 작성되는지 확인해 주세요. 스크립트가 동시다발적으로 여러 곳에서 실행됨으로 인해 Instance가 재설정될 가능성이 있습니다.

  2. 다른 인스턴스 중복 확인: 같은 클래스가 여러 프리팹에 올바르게 설정되지 않았는지 확인해야 합니다. 프로젝트에 ItemPurchase 프리팹이나 객체가 여러 개 존재하는 경우 Awake()Start()에서 가장 먼저 초기화된 객체로 Instance가 설정될 수 있습니다.

  3. 디버그 정보 활용: 현재 사용 중인 Debug.Log 메시지들이 실제로 문제를 디버그하는 데 도움이 되도록 다양한 함수 내 Instance와 관련된 정보를 출력하여 확인해 보세요. 예를 들면, Awake()에서 this가 어떤 객체인지, Instance가 어디서 초기화되고 있는지 등을 확인할 수 있습니다.

  4. 프로젝트 전체적으로 점검: 여러 스크립트들 간의 관계를 확인하고, 객체들이 참조하는 코드가 어떤 방식으로 연결되어 있는지를 점검해 보아야 합니다. Hierarchy 창을 통해 객체 구조를 확인하거나, 각 프리팹과 오브젝트에 의해 실행될 스크립트 로직을 점검해 보세요.

해당 문제 해결에 도움이 될 수 있는 질문과 답변도 아래에서 참고하시면 좋습니다:

위의 방법을 통해도 문제가 해결되지 않으신다면 추가적인 설명이나 상황이 필요할 수도 있습니다. 궁금한 점이 있다면, 추가 질문하거나 더 많은 정보를 제공해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.