Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
136 / 131 / 43
Регистрация: 07.11.2017
Сообщений: 553

Система бонусов для брони/оружия

07.03.2018, 10:40. Показов 4640. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет.
возник вопрос кто как делает систему бонусов для оружия и брони.
например есть оружие, в него вставили камень, это статичный бонус и просто прибавили.
curentDamage = defaulDamage + bonnus;
далее на нас накастовали "абра-кадабру" во время боя и этот каст имеет силу какое-то время.
далее на нас еще накастовал вражеский шаман отрицательный бонус, снова с временем действия.
далее пришел супер-мега герой и его "влияние" снова что-то прибавило нам, пока рядом.
и так далее))
да хотя бы сегодня "день сурка" всем воинам +20ATK

вот как это все продумать и организовать?
кто подскажет куда копать и куда смотреть....
может кто поделиться своей наработкой
буду премного благодарен любому пинку или помощи
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.03.2018, 10:40
Ответы с готовыми решениями:

OnClick для оружия
Подскажите такой вопрос , пытаюсь портировать фпс на Андройд так вот в чем проблема, на кнопку он клик нужно повесить игровой обьект оружие...

Составить формулу для оплаты по брони
Подскажите, как правильно составить фомулу для такой задачи. Нужно в столбце "Плата за бронь", в зависимости от выбранного...

Как выставить формулу для бонусов
Добрый день! Помогите выставить формулу в Excel для начисления несколько видов бонусов: 1) бонус выплачивается от 90% до 100% в...

22
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,225
07.03.2018, 11:45
ты и так на правильном пути. немного размышлений , экспериментов, и все получится. а реализовать можно по всякому я думаю.
самый разумный путь , добавь скрипт на все эти плюхи с нужными полями. при стыковке делай нужные изменения в статике
0
 Аватар для Serj190492
160 / 159 / 59
Регистрация: 19.02.2015
Сообщений: 830
07.03.2018, 12:03
Была идея собирать все положительные и отрицательные влияния в 2 массива.
Итоговое значение = базовое + сумма "положительного массива" - сумма "отрицательного массива".
Это если, например в случае с бронёй, несколько разных влияний. (например, шлем + 5, торс + 10, ноги + 15) и т.д.
0
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,225
07.03.2018, 12:12
а зачем все так усложнять ? ))
массивы и все такое... вопрос чисто для моего общего развития
0
 Аватар для Serj190492
160 / 159 / 59
Регистрация: 19.02.2015
Сообщений: 830
07.03.2018, 12:14
Ну не знаю, я думал для рассчета общего влияния.
Можно конечно без массива, просто всё считать отдельными значениями)
0
136 / 131 / 43
Регистрация: 07.11.2017
Сообщений: 553
07.03.2018, 12:39  [ТС]
Цитата Сообщение от Gammister Посмотреть сообщение
а зачем все так усложнять ? ))
массивы и все такое...
предложите как вы это видите)
0
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,225
07.03.2018, 12:45
я уже описал в общих чертах. технические детали это уже за вами
0
136 / 131 / 43
Регистрация: 07.11.2017
Сообщений: 553
07.03.2018, 12:51  [ТС]
Цитата Сообщение от Gammister Посмотреть сообщение
самый разумный путь , добавь скрипт на все эти плюхи с нужными полями. при стыковке делай нужные изменения в статике
а как же временное действие?
0
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,225
07.03.2018, 16:26
для этого есть Update() , корутины и таймеры ))
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
07.03.2018, 20:38
Цитата Сообщение от f3hler Посмотреть сообщение
например есть оружие, в него вставили камень, это статичный бонус и просто прибавили.
curentDamage = defaulDamage + bonnus;
далее на нас накастовали "абра-кадабру" во время боя и этот каст имеет силу какое-то время.
далее на нас еще накастовал вражеский шаман отрицательный бонус, снова с временем действия.
далее пришел супер-мега герой и его "влияние" снова что-то прибавило нам, пока рядом.
и так далее))
да хотя бы сегодня "день сурка" всем воинам +20ATK
вот как это все продумать и организовать?
В простейшем случае можно сделать так:
1) Делаем класс ParamModificator задача которого хранить данные для модификации параметра и уметь применять модификацию:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//modificator of parameter
[Serializable]
public class ParamModificator
{
    //name of modificator 
    public string Name { get; set; }
    //expiry time
    public float ExpiryTime { get; set; }
    //factor
    public float Factor { get; set; }
 
    //apply modificator to value (can be overrided in inherited calsses)
    public virtual void Apply(Param p, ref float val)
    {
        //simple sum
        val = val + Factor;
    }
}


В простейшем случае этот класс просто прибавляет константу к значению параметра. Но метод Apply - виртуальный, и можно сделать классы - наследники, которые смогут реализовывать более сложную логику - например не добавлять значение, а умножать на процент:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
    public override void Apply(Param p, ref float val)
    {
        val = val * Factor;
    }

В метод Apply передается и сам параметр, это позволяет реализовывать более сложную логику - например добавлять бонус только если начальное значение было больше определенного значения:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
    public override void Apply(Param p, ref float val)
    {
        if(p.InitValue > 50)
             val = val * Factor;
    }


Класс ParamModificator содержит поле ExpiryTime которое хранит время окончания действия модификатора (в секундах игрового времени).

2) Делаем класс Param, который будет содержать сам параметр и его логику:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//parameter with modificators
[Serializable]
public class Param
{
    //initial value
    public float InitValue { get; set; }
    //min
    public float Min { get; set; }
    //max
    public float Max { get; set; }
    //modificators
    public LinkedList<ParamModificator> Modificators { get; private set; }
    //owner
    public MonoBehaviour Owner { get; private set; }
 
    //total value
    public float Value
    {
        get
        {
            //start value
            var res = InitValue;
 
            //enumerate modificators
            var node = Modificators.First;
            while (node != null)
            {
                var modif = node.Value;
                //check time
                if (modif.ExpiryTime < Time.time)
                {
                    //expired => remove modificator
                    var temp = node;
                    node = node.Next;
                    Modificators.Remove(temp);
                }
                else
                {
                    //apply modificator
                    modif.Apply(this, ref res);
                    node = node.Next;
                }
            }
 
            //check min/max
            if (res < Min) res = Min;
            if (res > Max) res = Max;
 
            return res;
        }
    }
 
    public Param(MonoBehaviour owner)
    {
        InitValue = 50;
        Min = 0;
        Max = 100;
        Modificators = new LinkedList<ParamModificator>();
        Owner = owner;
    }
 
    public void AddModif(float factor, float expiryTime = float.MaxValue, string name = "unknown")
    {
        AddModif(new ParamModificator() {Factor = factor, Name = name, ExpiryTime = expiryTime });
    }
 
    public void AddModif(ParamModificator modificator)
    {
        Modificators.AddLast(modificator);
    }
 
    public void RemoveModif(string name)
    {
        var found = Modificators.FirstOrDefault(m=>m.Name == name);
        if(found != null)
            Modificators.Remove(found);
    }
}

Этот класс содержит начальное значение параметра, список модификаторов, методы для добавления модификаторов и некоторые другие данные.
Класс содержит свойство Value, которое возвращает текущее значение параметра с учетом всех модификаторов.
Класс автоматически проверяет время ExpiryTime модификатора, и если срок действия окончен - модификатор автоматически удаляется.
Класс также автоматически проверяет выход значения за пределы Max/Min и возвращает в необходимые границы.
Класс также содержит методы для добавления и удаления модификаторов.

3) Делаем тестовый класс Weapon с параметром Damage:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Weapon : MonoBehaviour
{
    //parameter with modificators
    public Param Damage;
 
    void Start ()
    {
        Damage = new Param(this);
 
        //for testing...
        Damage.AddModif(+10, float.MaxValue, "WeaponUpgrade");//permamnent bonus +10
        Damage.AddModif(+1, Time.time + 5);//temporary bonus +1 for 5 seconds
    }
    
    void Update ()
    {
        Debug.Log("Damage: " + Damage.Value);
    }
}


Когда нужно добавить модификатор (например на оружие наложено "заклятие"), нужно вызвать:
C#
1
weapon.Damage.AddModif(-15, Time.time + 10);//decrease damage for 10 seconds
Этот модификатор будет отнимать 15 пунктов из мощности оружия и будет автоматически удален через 10 секунд.

PS
Было бы красивее сделать модификаторы через лямбды, типа такого:
C#
1
weapon.Damage.AddModif(v => v - 15, Time.time + 10);//decrease damage for 10 seconds
Тогда бы не понадобилось делать наследников ParamModificator для более сложного поведения.
Но тогда состояние игры не могло бы быть сохранено (поскольку лямбды не сериализуются). В текущей же реализации состояние может быть полностью сохранено вместе с модификаторами.
5
18 / 16 / 0
Регистрация: 03.01.2018
Сообщений: 208
Записей в блоге: 1
07.03.2018, 20:55
Сложно как-то)

Делаешь базовый класс Buff, от него наследуешь всяческие реализации (+ к броне, + к атаке и т.д.), в нем методы активации, деактивации, время действия.

Создаешь список типа Buff, в него добавляешь баффы в зависимости от предмета, который используешь.

В общих словах описал, я делал так и считаю, что это удобно.

Потом появятся вопросы о том, как добавлять процентное увеличение параметров, например когда базовая броня 1, экипировка дает ещё 5, получилось 6. Как к 6 брони добавить 10% новой брони, чтобы потом не было глюков при надевании и снимании брони или вообще от вражеского дебаффа? Ну это уже на будущее и реализация тоже не сложная.
0
136 / 131 / 43
Регистрация: 07.11.2017
Сообщений: 553
07.03.2018, 22:22  [ТС]
letsmail9, а набросать пример можно?
0
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
08.03.2018, 10:00
А я опять скажу про динамическую типизацию )))
0
08.03.2018, 11:06

Не по теме:

Цитата Сообщение от Cr0c Посмотреть сообщение
А я опять скажу про динамическую типизацию )))
Можете пояснить как для не местных? :)

0
136 / 131 / 43
Регистрация: 07.11.2017
Сообщений: 553
08.03.2018, 11:26  [ТС]
Cr0c, лучше не сказать, а пример написать)
то есть, для неграмотных* на примере пояснить

*это я про себя
0
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,225
08.03.2018, 12:30
ты же понимаешь, что это целая система, и расписывать тебе целые статьи ни у кого нет желания. не ленись пойди на ютьюб ,если достаточно терпения найдешь ответы в течении часа. а мелочи, по ходу дела, тебе подскажут думаю тут.
я уверен можно сделать все не так сложно, как некоторые тут пафосом занимаются а не подсказывают. удачи !

Добавлено через 32 минуты
да и никто не знает что у тебя за игра, насколько она сложна, 2д или 3д, система на которой она у тебя построена тоже. так что тут тебе придется разрабатывать самому. я и сам на пороге разработки такой системы. думаю реализовывать ее на основе простых и понятных глазу алгоритмах, хоть она сама по себе будет не простая. что и тебе советую
0
18 / 16 / 0
Регистрация: 03.01.2018
Сообщений: 208
Записей в блоге: 1
08.03.2018, 13:45
f3hler, пишу даже не из IDE

Базовый класс
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public abstract class Buff{
    public string Name;
 
    public float time;
 
    public virtual void Activate()
    {
    }
    public virtual void Deactivate()
    {
    }
 
    void StartTimer()
    {
    //код таймера
    //хранит данные в поле time 
    //вызывает onTimer
    }
 
    void onTimer(){
    }
}

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class AddPower : Buff{
    public AddPower(){
    //конструктор
    }
 
    public override void Activate(float power, float time){
    //находим персонажа и статы, к ним добавляем power
    StartTimer(time);
    }
 
    override void onTimer(){
    Deactevate();
    }
}
В каком-то месте должен быть список баффов
C#
1
List<Buff> buffs = new List<Buff>();
дальше просто работа со списком
1
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
08.03.2018, 16:22
Пример на pastebin.com
Это просто ПРИМЕР, который надо расширять и дорабатывать.
1
136 / 131 / 43
Регистрация: 07.11.2017
Сообщений: 553
09.03.2018, 09:45  [ТС]
Gammister, каждый делает так на что способен)
так что пафоса я не вижу.
доберусь до компа все гляну и покручу
0
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,225
09.03.2018, 11:55
без проблем коллега. даже будет интересно как ты будешь все делать. если что держи нас в курсе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.03.2018, 11:55
Помогаю со студенческими работами здесь

Программа для сбора бонусов webmoney
Здравствуйте, дорогие форумчане!Хотел создать программу для собирание вебманий бонусов но возникли трудности с получения капчи(reCAPTCHA...

Класс Weapon для оружия
Здравствуйте. Задача: Реализуйте класс Weapon для оружия, который при инициализации должен принимать имя оружия name, наносимый урон...

Редактор оружия для GTA vice city
Редактор оружия для GTA vice city Здравствуйте всем. Я являюсь фанатом в GTA Vice City. В директории игры есть файл Weapon.dat, он...

Чит для игры: как сделать автонаведение оружия на противника
Как сделать аим (автонаведение на игрока) для Самп к примеру?

Выбор оружия для создания современного пользовательского интерфейса c запасом на будующее
Есть большой проект под Windows(порядка 15 Mб кода) на С++. Написан он на основе собственных библиотек. Теперь хочется отказаться от этих...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru