У меня есть вопрос об ошибке, которая возникает, когда я добавляю универсальный класс в компонент как единое целое - PullRequest
1 голос
/ 22 марта 2019
  • Положение

Я хочу реализовать обобщенный «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>
  • 1029 * применить *

Чтобы реально использовать его, мы создаем дочерний класс, как показано ниже.

public class TempItem : PoolingItemBase<TempItem>

public class TempItemManager : PoolingManagerBase<TempItem>
  • результат

Синглтон

_Instance = gObject.AddComponent<T>();

Нуль возвращается в части

Я два дня копал, но у меня нет острой причины ...

Есть ли ограничение на написание вложенных обобщений в Unity?

--------------- РЕДАКТИРОВАТЬ ---------------

  1. Чтобы отличить его от существующего компонента Unity, я заменил унаследованный компонент Singleton на CComponent

  2. Ниже приведен код для класса 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()    { }
}
  1. Кажется, он пришел к ответу, подумав о мучительном времени. Когда я добавил _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)), но теперь все работает хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...