inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

책 3권을 영상으로 만든 Unity 게임 개발

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

Knight구매시 오류

해결된 질문

168

SeongBaek CHO

작성한 질문수 16

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

 

C# unity

답변 2

1

JEngineer

질문 감사합니다!

 

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

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

0

JEngineer

asd.png.webp

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

0

SeongBaek CHO

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

 

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

 

 

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

1

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 변수에 한번더 값을 삽입하는 방법도 좋습니다!

1

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에 아이템 넘버와 코인 가격 저장해서 호출하게끔 변경했네요. 코인가격도 이렇게 하면되는거죠??

1

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 창을 통해 객체 구조를 확인하거나, 각 프리팹과 오브젝트에 의해 실행될 스크립트 로직을 점검해 보세요.

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

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

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

섹션7 수업자료 업로드 부탁드립니다.

0

13

2

Dictionary Key를 int에서 string으로 변경한 이유에 대한 문의

0

14

1

프로젝트 질문 문의

0

42

1

UI 기능 관련 질문이 있습니다!

0

34

2

03-01 (16. CharacterController)

0

28

2

TLS 질문드립니다.

0

42

2

Task 구현 28:36 Equals 에서 잘 모르는 부분이 있습니다.

0

25

2

SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.

0

46

2

픽셀 좌표 스크린 좌표

0

32

0

Locomotion랑 Turn 이 꼭 부모 자식 관계일 필요가 있나요?

0

23

1

Rider대신 VS를 써도 괜찮나요?

0

113

2

Claude Code Pro구독하고 있는 상태에서 크레딧 결제, 사용문의

0

195

2

LobbyUIController의 백키가 사라졌는데 왜그런건가요?

0

40

2

무조건 타이틀 씬부터 시작해야하나요?

0

39

1

BaseUI, UIManager

0

50

3

토큰 사용량 및 인증 관련해서 질문드립니다.

0

128

2

SuperDefender 구매오류

0

71

2

승리수가 안 올라갑니다

1

75

2

섹션5-11

1

64

1

OnTriggerEnter2D에서 문제가 생겼어요

1

226

2

에너미 이동 질문

1

124

2

유닛 리지드바디 질문

1

118

2

애니메이션 질문

1

106

1

닉네임 텍스트에 이름 기입은

1

131

1