На этой неделе продолжил (и пока что закончил) рефакторинг. За счет этого быстро добавил карту, на реализацию которой раньше ушла бы куча времени.

Вводная инфа
Делаю коллекционную карточную PvP-игру на Unity и C#. Гитхаб.
Что сделал
Добавил карту с эффектом: "Сбросьте карту со своей руки. Если это атака, наносит 9 урона". То есть, карта может нанести или не нанести урон в зависимости от того, какую карту я сбросил со своей руки. Раньше я бы не знал, как это делать. А теперь у меня есть система ивентов, про реализацию которой я писал на прошлой неделе. Я просто проверяю тип карты из последнего ивента в стаке и на основе него решаю, исполнять ли нанесение урона:
if (cardManager.eventStack.Peek().Card.GetComponent<CardScript>().cardType == CardScript.CardType.Attack) { cardScript.otherSide.DealDamage(cardScript.finalDamage); } cardScript.playerActionCompleted = true; break;
Из рефакторинга: теперь использую для хранения данных о каждой карте отдельный скрипт:
public class CardData : MonoBehaviour { public Dictionary<string, Card> cardDictionary = new Dictionary<string, Card>(); void Awake() { cardDictionary["BlueAttack1"] = new Card {Damage = 5 }; cardDictionary["BlueAttack2"] = new Card { Mana = 1, Damage = 4, DrawCards = 2 }; cardDictionary["BlueDefend1"] = new Card { Block = 6 }; cardDictionary["RedAttack1"] = new Card { Damage = 6 }; cardDictionary["RedAttack2"] = new Card { Damage = 12, Mana = 2 }; cardDictionary["RedDefend1"] = new Card { Block = 5 }; cardDictionary["RedPower1"] = new Card { GainStrength = 1, Mana = 1 }; cardDictionary["GraySkill1"] = new Card { IsSpecial = true, DrawCards = 2 }; cardDictionary["GraySkill2"] = new Card { AddCardBuff = 1 }; cardDictionary["BlueAttack3"] = new Card { IsSpecial = true, Damage = 9, Mana = 1 }; cardDictionary["BlueSkill1"] = new Card { IsSpecial = true, Mana = 1 }; } } public class Card { public int Mana = 0; public bool IsSpecial = false; public int Damage = 0; public int Block = 0; public int GainStrength = 0; public int GainDexterity = 0; public int DrawCards = 0; public int AddCardBuff = 0; }
Знаю, что выглядит колхозно и тут вроде как должен быть более простой способ. Но раньше у меня вообще все характеристики вытаскивались из описания карты, хранящегося в таблице локализации, вот таким вот кривым образом. Мне это показалось наиболее простым, чтобы размечать в картах, где находится блок, где урон и т.д. :))
if (cardDescriptionDynamic.Contains("[")) { int firstSym = cardDescriptionDynamic.IndexOf('['); int secondSym = cardDescriptionDynamic.IndexOf(']'); string damage = ""; for (int i = firstSym + 1; i < secondSym; i++) { damage += cardDescriptionDynamic[i]; } cardDamage = Int32.Parse(damage); cardDescriptionDynamic = cardDescriptionDynamic.Replace("[", ""); cardDescriptionDynamic = cardDescriptionDynamic.Replace("]", ""); finalDamage = cardDamage + cardSide.Strength; cardDescriptionDynamic = cardDescriptionDynamic.Replace(damage, finalDamage.ToString()); if (cardSide.Strength != 0) { string coloredDamage = "<color=" + (cardSide.Strength > 0 ? "green" : "red") + ">" + finalDamage.ToString() + "</color>"; cardDescriptionDynamic = cardDescriptionDynamic.Replace(finalDamage.ToString(), coloredDamage); } }
Теперь это все с помощью переменных забивается в таблице локализации и подсвечивается при необходимости:

Этот пост входит в цикл постов про игру, которую я потихоньку делаю уже несколько месяцев. Я делюсь всем производственным процессом: какие решения я принимаю в разработке, геймдизайне, интерфейсе, арте и других сферах. Подписывайтесь тут или в телеграм-канале: @nigylam_blog.
