В игре в определенный момент я создаю NPC, в зависимости от его типа (строка) я добавляю на него компоненты. Сначала я не парился и сделал так:
Синтаксис:
Используется csharp
if (type == "map")
{
this.gameObject.AddComponent<NPCMap>();
}
if (type == "toFight")
{
this.gameObject.AddComponent<NPCToFightScene>();
}
if (type == "oldFights")
{
this.gameObject.AddComponent<NPCToOldFights>();
}
{
this.gameObject.AddComponent<NPCMap>();
}
if (type == "toFight")
{
this.gameObject.AddComponent<NPCToFightScene>();
}
if (type == "oldFights")
{
this.gameObject.AddComponent<NPCToOldFights>();
}
Потом мне это надоело, решил использовать словарь делегатов
Синтаксис:
Используется csharp
_addComponents =new Dictionary<string, AddComponentsDelegate>
{
{ "map", this.AddMapComponent },
{ "toFight", this.AddToFightComponent },
{ "oldFights", this.AddOldFightsComponent },
};
.......
_addComponents[type]();
{
{ "map", this.AddMapComponent },
{ "toFight", this.AddToFightComponent },
{ "oldFights", this.AddOldFightsComponent },
};
.......
_addComponents[type]();
Все работает прекрасно. но в какой-то момент получилась ситуация, что для одного типа НПЦ мне надо добавлять 2 компонента
Синтаксис:
Используется csharp
_addComponents = new Dictionary<string, AddComponentsDelegate>
{
{ "map", this.AddMapComponent },
{ "toFight", this.AddToFightComponent },
{ "oldFights", this.AddOldFightsComponent },
{ "dialog", this.AddMoveToMainCharacterComponent },
{ "dialog", this.AddTalkToMainCharacterComponent },
};
{
{ "map", this.AddMapComponent },
{ "toFight", this.AddToFightComponent },
{ "oldFights", this.AddOldFightsComponent },
{ "dialog", this.AddMoveToMainCharacterComponent },
{ "dialog", this.AddTalkToMainCharacterComponent },
};
Так не работает, естественно, ключевое значение "dialog" повторяется. Можно методы AddMoveToMainCharacterComponent и AddTalkToMainCharacterComponent вызывать из другого метода, например, AddDialogComponents, но тогда теряется вся гибкость.
Как лучше это реализовать? Спасибо!