Типы брони/атаки

Программирование на Юнити.

Типы брони/атаки

Сообщение olimpset 17 сен 2017, 22:34

В голову не приходит, как с помощью ООП (нужных паттернов) сделать механику повреждений, где урон зависит от типов оружия и брони.

К примеру есть танк. В него попала пуля из винтовки, урон 1 хп.
В танк попал снаряд - 50хп.
Огнемет - 0 хп.
То бишь, у танка явно толстая броня и стоит иммунитет на обычные пули.
Так вот как сделать это. Что бы при атаке,учитывался тип брони и тип атаки.
Кроме как switch-case в голову ничего не приходит, уверен, есть лучшие решения.
Подскажите паттерны, или псевдо кодом поясните.
olimpset
UNITрон
 
Сообщения: 327
Зарегистрирован: 22 фев 2014, 15:16

Re: Типы брони/атаки

Сообщение IDoNotExist 18 сен 2017, 08:31

Если надо реализовать прям разное поведение для разных типов снаряда, то это вроде как называется "стратегия", а именно, создаёшь базовый абстрактный класс/интерфейс снаряда, в нём создаёшь метод, который будет вызываться при попадании в "броню":
Синтаксис:
Используется csharp
public abstact class ProjectileBase
{
    public int damage = 10;

    public abstract void OnTankHit(TankHealth th);
}
 


Затем реализуешь конкретные классы снарядов и прописываешь в каждом своё поведение по отношению к "броне":
Синтаксис:
Используется csharp
public class RifleBullet : ProjectileBase
{
    public override void OnTankHit(TankHealth th)
    {
        int realDamage = Mathf.Max(0, damage - th.armor);
        th.OnDamage(damage);
    }
}

public class Flame: ProjectileBase
{
    public override void OnTankHit(TankHealth th)
    {
        th.OnDamage(0);
    }
}

 


Но это один фиг не является панацеей от "некрасивого" кода, у тебя вполне могут возникнуть задачи в которых такой вариант будет только костылём. Так что вполне возможно что switch case не такой уж плохой вариант.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Типы брони/атаки

Сообщение snezhok_13 18 сен 2017, 10:21

Сделать класс Damage, в нем поле enum DamageType (в котором Fire, Grenade, TankWeapon, RegularBullet и тп).
В обработчике DealDamage проверяешь Vulnerability к типу (можно сделать это Dictionary<DamageType, float>). В float нормализованный фактор урона - 0 неуязвим, 1 полностью уязвим.

Такой подход позволит броню сделать, исчерпаемую, неисчерпаемую, бонусы какие угодно.
Разработка игр, немножко игровая журналистика, сейчас делаем Календарь: даты выхода игр
Аватара пользователя
snezhok_13
UNIверсал
 
Сообщения: 450
Зарегистрирован: 09 сен 2013, 11:12
Skype: s.coremission
  • Сайт

Re: Типы брони/атаки

Сообщение olimpset 18 сен 2017, 16:17

snezhok_13 писал(а):Сделать класс Damage, в нем поле enum DamageType (в котором Fire, Grenade, TankWeapon, RegularBullet и тп).
В обработчике DealDamage проверяешь Vulnerability к типу (можно сделать это Dictionary<DamageType, float>). В float нормализованный фактор урона - 0 неуязвим, 1 полностью уязвим.

Такой подход позволит броню сделать, исчерпаемую, неисчерпаемую, бонусы какие угодно.


Возможно этот вариант будет лучший. А может и человека, который ответил выше (с паттерном стратегия). Подумаю еще.
olimpset
UNITрон
 
Сообщения: 327
Зарегистрирован: 22 фев 2014, 15:16


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 12