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, если их нельзя сделать. Как можно решить данную проблему?
Заранее Спасибо
Думаю, вам нужно использовать паттерн 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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP