2017-01-03 1 views
0

У меня есть приложение Unity C#, где каждая игра внутри имеет один абстрактный контроллер. Он наследуется от другого класса, позволяя ему получить доступ, как статическая версия базового поведения в единстве.Поиск и запуск универсального класса?

public class AbstractController<T> : SingletonMonoBehavior<T> { 
    virtual public void Begin() { 
     //startup code here 
    } 
} 

Итак, чтобы найти этот класс, я должен знать, что такое T. Нужно ли мне размышлять об этом? Или я могу просто сохранить типы T в списке где-нибудь и получить доступ к ним динамически? Прямо сейчас, у меня есть словарь названий игр и классов, которые наследуют от абстрактных контроллеров - так что я знаю, что T должно быть, но когда я делаю это:

_controllerTypes = new Dictionary<GameScene, Type>(); 
_controllerTypes.Add (GameScene.FrogJump, typeof(FJGameController));  
Type T = _controllerTypes [_startScene]; 
AbstractController<T>[] controllers = GameObject.FindObjectsOfType<AbstractController<T>>(); 

Я получаю ошибку компилятора о том, что Msgstr "Тип или имя пространства имен` T 'не найдено. " Есть ли способ разработать вокруг этого? Я не хочу использовать рефлексию, но я хочу, чтобы она была красивой.

+1

Итак, вам нужен тип T в функции? – devRicher

+0

Добавлено больше вопросов на вопрос - спасибо! – Catlard

+1

Сингелтоны и их неотъемлемость не смешиваются. Я бы порекомендовал просто сбросить «SingletonMonoBehavior » и либо использовать обычное «MonoBehavior» для объекта, который загружается в сцену предварительной загрузки, или даже лучше использовать ['ScriptableObject'] (https://www.youtube.com)./watch? v = VBA1QCoEAX4 & list = PLX2vGYjWbI0RtPoeDoBUPnwY8USGra-pD & index = 49) для представления общего состояния. –

ответ

0

То, что вы собираетесь сделать, абсолютно возможно, но требует использования отражения. Вы не должны этого делать, так как это повлияет на производительность вашей игры. Например Catlard, упомянутый в разделе комментариев, используйте интерфейс.

интерфейсы позволяют гарантировать, что класс имеет функцию, но как Вы получаете доступ к этому классу в первую очередь? Например, вы не можете использовать GetComponent для всех IControllable интерфейсов. Я бы все еще должен иметь абстрактный класс контроллера, не так ли?

Вы можете использовать GetComponent для проверки интерфейса.

public class Player : MonoBehaviour, IControllable 
{ 

} 

тогда ваш интерфейс:

public interface IControllable 
{ 

} 

Теперь, позволяет сказать, что ваш сценарий игрока прикрепляется к GameObject под названием "Игрок".

GameObject plyrObj = GameObject.Find("Player"); 

if (plyrObj.GetComponent<IControllable>() != null) 
{ 
    Debug.Log("Player is Controllable"); 
} 

У вас также может быть несколько интерфейсов для разных классов. Вы также можете сделать интерфейс общим с чем-то вроде public interface IControllable<T>{}. Это должно помочь вам повторно выполнить свою работу.

+0

Вы попробовали мой ответ? – Programmer

 Смежные вопросы

  • Нет связанных вопросов^_^