Я хочу реализовать обобщенный «PoolingManagerBase» в одноэлементном шаблоне для объединения классов.
Почему класс, который наследуется от 'PoolingManagerBase', не создает компонент, содержащий экземпляр singleton?
Во-первых, я реализую универсальный класс 'Singleton'.
Код класса 'Singleton' выглядит следующим образом
public abstract class Singleton<T> : CComponent where T : CComponent
{
private static T _Instance = null;
public static T Instance
{
get
{
if (_Instance == null)
{
GameObject gObject = new GameObject(typeof(T).ToString());
_Instance = gObject.AddComponent<T>();
DontDestroyOnLoad(gObject);
}
return _Instance;
}
}
public static T Create() => Instance;
}
Элементы также хранятся в форме PoolingItemBase и имеют вид элемента ITEM, как показано ниже
public class PoolingItemBase where ITEM : PoolingItemBase<ITEM>
Следовательно, менеджер предметов также определяет ПУНКТ, как показано ниже
public class PoolingManagerBase <ITEM>: Singleton <PoolingManagerBase<ITEM>> where ITEM : PoolingItemBase<ITEM>
Чтобы реально использовать его, мы создаем дочерний класс, как показано ниже.
public class TempItem : PoolingItemBase<TempItem>
public class TempItemManager : PoolingManagerBase<TempItem>
Синглтон
_Instance = gObject.AddComponent<T>();
Нуль возвращается в части
Я два дня копал, но у меня нет острой причины ...
Есть ли ограничение на написание вложенных обобщений в Unity?
--------------- РЕДАКТИРОВАТЬ ---------------
Чтобы отличить его от существующего компонента Unity, я заменил унаследованный компонент Singleton на CComponent
Ниже приведен код для класса CComponent
public abstract class CComponent : MonoBehaviour
{
[HideInInspector] public Transform _Transform = null;
[HideInInspector] public Rigidbody _Rigidbody = null;
[HideInInspector] public Rigidbody2D _Rigidbody2D = null;
public virtual void Awake()
{
_Transform = transform;
_Rigidbody = GetComponentInChildren<Rigidbody>();
_Rigidbody2D = GetComponentInChildren<Rigidbody2D>();
}
public virtual void Update() { }
public virtual void FixedUpdate() { }
public virtual void LateUpdate() { }
}
- Кажется, он пришел к ответу, подумав о мучительном времени.
Когда я добавил
_Instance
через AddComponent<T>()
внутри Singleton
, тип, который я действительно импортировал, содержал информацию о <T>
, а не о низшем классе.
Мы только что узнали, что Unity не поддерживает базовые компоненты, поэтому приведенный выше код не работает.
Поэтому я изменил Singleton
следующим кодом.
public abstract class Singleton<T> : CComponent where T : MonoBehaviour
{
private static T _Instance = null;
private static Type _InstanceType = null;
public static T Instance
{
get
{
if (_Instance == null)
{
GameObject gObject = new GameObject(typeof(T).ToString());
_Instance = gObject.AddComponent(_InstanceType) as T;
DontDestroyOnLoad(gObject);
}
return _Instance;
}
}
public static T Create(Type tType)
{
_InstanceType = tType;
return Instance;
}
}
Мне было неудобно проходить через Create(typeof(T))
, но теперь все работает хорошо.