Как стать автором
Обновить

One-on-one. Девлог. Карта со сложным кастомным эффектом

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров899

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

Вводная инфа

Делаю коллекционную карточную 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.

Теги:
Хабы:
Всего голосов 3: ↑2 и ↓1+4
Комментарии0

Публикации

Истории

Работа

Unity разработчик
15 вакансий

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн