작성
·
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 인스턴스에의해 못 잡고있는 것 같기도한데... 어디서부터 봐야할지 모르겠어요ㅠ
답변 2
1
질문 감사합니다!
ItemNumber 변수를 인스펙터 창에서 어떤 값을 삽입했는지부터 알 수 있을까요?
만약에 제대로 설정이 되었다면 다른 문제인지 한번 찾아보겠습니다!
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 변수에 한번더 값을 삽입하는 방법도 좋습니다!
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에 아이템 넘버와 코인 가격 저장해서 호출하게끔 변경했네요. 코인가격도 이렇게 하면되는거죠??
0
안녕하세요, 인프런 AI 인턴입니다. SeongBaek CHO님.
현재 유니티 게임 개발 중, ItemPurchase
스크립트에서 아이템 구매와 관련된 문제가 발생하여 어려움을 겪고 계신 것 같습니다. 문제는 Instance
가 super defender
로 잘못 설정되어 나이트 구매가 올바르게 이루어지지 않는다는 점인데요. 이 경우 싱글턴 패턴이 잘못 구성되었거나, 다른 이유로 Instance
가 제대로 초기화되지 않았을 가능성이 있습니다. 아래 몇 가지 점검 사항을 안내드립니다:
싱글턴 초기화 확인: Awake()
메서드 내에서 Instance
를 this
로 설정하셨는데, 이 경우 ItemPurchase
클래스가 제대로 초기화되었는지 확인해야 합니다. Instance
가 정확히 한 번만 설정될 수 있도록 작성되는지 확인해 주세요. 스크립트가 동시다발적으로 여러 곳에서 실행됨으로 인해 Instance
가 재설정될 가능성이 있습니다.
다른 인스턴스 중복 확인: 같은 클래스가 여러 프리팹에 올바르게 설정되지 않았는지 확인해야 합니다. 프로젝트에 ItemPurchase
프리팹이나 객체가 여러 개 존재하는 경우 Awake()
나 Start()
에서 가장 먼저 초기화된 객체로 Instance
가 설정될 수 있습니다.
디버그 정보 활용: 현재 사용 중인 Debug.Log
메시지들이 실제로 문제를 디버그하는 데 도움이 되도록 다양한 함수 내 Instance
와 관련된 정보를 출력하여 확인해 보세요. 예를 들면, Awake()
에서 this
가 어떤 객체인지, Instance
가 어디서 초기화되고 있는지 등을 확인할 수 있습니다.
프로젝트 전체적으로 점검: 여러 스크립트들 간의 관계를 확인하고, 객체들이 참조하는 코드가 어떤 방식으로 연결되어 있는지를 점검해 보아야 합니다. Hierarchy
창을 통해 객체 구조를 확인하거나, 각 프리팹과 오브젝트에 의해 실행될 스크립트 로직을 점검해 보세요.
해당 문제 해결에 도움이 될 수 있는 질문과 답변도 아래에서 참고하시면 좋습니다:
위의 방법을 통해도 문제가 해결되지 않으신다면 추가적인 설명이나 상황이 필요할 수도 있습니다. 궁금한 점이 있다면, 추가 질문하거나 더 많은 정보를 제공해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
Unit4Button, Unit5Button에 부착되어 있는 ItemPurchase 스크립트의 UnitObjects에 스크립터블 오브젝트가 각각 제대로 부착되어 있는지도 확인해주시면 감사하겠습니다!