TransWikia.com

Как сделать статические переменные в Unity3d

Stack Overflow на русском Asked by Steve Dekart on November 22, 2021

Мне нужно, чтобы в любом скрипте я мог вызвать статический метод, который создаст на сцене UI уведомление. В самом методе содержатся аргументы для заголовка уведомления, описание и тип уведомления (тип увед. потом будет определять, какой спрайт (иконку) поставить уведомлению).

Этот метод должен вызываться где-то так:
“` Notification.Call(“Setting”, “Settings have been saved”, Type.Notice); “`

Написав скрипт:

using UnityEngine;
using UnityEngine.UI;

public class Notification : MonoBehaviour
{
    //Префаб уведомления из файлов проекта 
    [SerializeField]
    private static GameObject prefabNotification;
    
    //Структура, где содержатся переменные типа Sprite и один метод, который возвращает выбранный Sprite 
    //(сделал это в попытках отобразить спрайты в Inspector выпадающим списком - ничего не показывает)
    [SerializeField]
    private static TypeSprite typeSprite;

    public static void Call(string header, string description, Type type)
    {
        //Создание уведомления
    }
}
[System.Serializable]
public struct TypeSprite
{
    public Sprite note;
    public Sprite quest;
    //Другие переменные...

    Sprite SpriteSelected(Type type)
    {
        switch(type)
        {
            case Type.Notice:
                return note;
            case Type.Quest:
                return quest;
            //Другие...
        }
        return null;
    }
}

public enum Type
{
    Notice,
    Quest,
    //Другие...
}

Но в англоязычных сайтах пишут, что нельзя писать статические переменные, т.к. они не будут отображаться в Inspector непосредственно в самом скрипте. (Или плати в Asset Store за плагин для статических)

Можете ли вы мне предложить альтернативу статическим переменным в Unity, если их нельзя сделать. Как можно решить данную проблему?

Заранее Спасибо

One Answer

Думаю, вам нужно использовать паттерн Singleton. Для этого необходимо изменить класс Notification следующим образом (удалил статические поля и методы, добавил статическое поле instance и инициализацию на старте)

using UnityEngine;
using UnityEngine.UI;

public class Notification : MonoBehaviour
{
//Префаб уведомления из файлов проекта 
[SerializeField]
private GameObject prefabNotification;

//Структура, где содержатся переменные типа Sprite и один метод, который возвращает выбранный Sprite 
//(сделал это в попытках отобразить спрайты в Inspector выпадающим списком - ничего не показывает)
[SerializeField]
private TypeSprite typeSprite;

public void Call(string header, string description, Type type)
{
    //Создание уведомления
}

public static Notification instance = null; // Экземпляр объекта

// Метод, выполняемый при старте игры
void Start () 
{
// Теперь, проверяем существование экземпляра
// Экземпляр менеджера не был найден
if (instance == null) 
{ 
    instance = this; // Задаем ссылку на экземпляр объекта
} 
else if(instance == this)
{ 
    // Экземпляр объекта уже существует на сцене
    Destroy(gameObject); // Удаляем объект
}

    // Теперь нам нужно указать, чтобы объект не уничтожался
    // при переходе на другую сцену игры
    DontDestroyOnLoad(gameObject);
}
}

Таким образом, статическим будет только поле в классе, указывающее на экземпляр менеджера уведомлений. Повесьте его на пустой GameObject, он не будет удаляться между сценами, благодаря DontDestroyOnLoad(), и вы сможете вызывать его из любого места с помощью Notification.instance Дополнительно про Singleton можно прочитать здесь, например

Answered by luvjungle on November 22, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP