Как реализовать шаблон SingleTon для сбора монет?

В скрипте PlayerInventory реализовать (шаблон) Singleton.Cделать начисление монеток путем обращения к Instance этого класса. Сбор монет реализовать в скрипте Player. Ниже мой код:

public int CoinsCount;
private void Awake() 
{
    Debug.Log(Player.Instance.CoinsCount);
    
}
public static Player Instance {get;set;}

 
 }

А это скрипт Player:

 public class Coin
{
int CoinsCount;
public  void OnTriggerEnter2D(Collider2D col) 
{
    if(col.gameObject.CompareTag("Coin"))
    {
        CoinsCount++;
        Destroy(col.gameObject);
    }
 }
}

Можете подсказать пожалуйста как реализовать это верно.Заранее спасибо. Исправленная версия работает вот так Предупреждения

Код исправленной версии есть в комментарии к первому ответу на мой вопрос.


Ответы (1 шт):

Автор решения: Artub34

Нашёл решение, проверил у себя и всё работает. Значит , я заметил что у вас singleton PlayerInventory прикреплен к персонажу. Так быть НЕ должно. Singleton должен всегда висеть на пустом одиночном объекте (от этого и перевод singleton - одиночка). Нажимаете Create Empty и вешаете на него скрипт PlayerInventory, а скрипт Player так пусть и остается на герое.

public class PlayerInventory : MonoBehaviour
{
    public int coinsCount{get;private set;} = 0;
    public static PlayerInventory Instance{get;private set;} = null;
    void Awake()
    {
        if(Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(Instance);
        }
        else Destroy(gameObject);
    }
    public void AddCoins(int count)
    {
        coinsCount += count;
    }
    public void AddCoins()
    {
        coinsCount++;
    }
}
public class Player : MonoBehaviour
{
   public void OnTriggerEnter2D(Collider2D col)
   {
      if(col.gameObject.CompareTag("Coin"))
      {
         PlayerInventory.Instance.AddCoins();
         Debug.Log("Количество монет = " + PlayerInventory.Instance.coinsCount);
         Destroy(col.gameObject);
      }
   }
}
→ Ссылка