Система рандомного лута в сундуке (Unity3D, C#)

489
19 января 2017, 02:04

Нужна помощь. Я хочу сделать систему рандомного лута из сундука для игры, но не получается. К примеру есть 5 категории: Обычные, Рарная, Мистическая, Эпическая, Легендарная. Шанс, что может выпасть Обычная 65%, Рарная 45%, Мистическая 25%, Эпическая 15%, а Легендарная 5%. Например в будущем Категории предметов могут увеличиться, а шансы поменяться. У меня была идея, к каждому предмету привязать свою цифру, и сделать массив, ну и тут столкнулся с проблемой, я новичок с Unity3D, и знания по C# не много забыты. Будет несколько сундуков, с ячейками лута. Например обычный сундук имеет 10 ячеек, и в этом сундуке может выпасть 10 рандомных предмета. Помогите пожалуйста, как вот такое дело можно оформить в виде кода. Заранее спасибо.

Answer 1

На мой взгляд самое простое, может быть и не самое правильное, решение - это взять и генерировать числа от 1 до 155, а далее смотреть, если число в промежутке:

  • от 1 до 65 - Обычная
  • от 66 до 110 - Рарная
  • от 111 до 135 - Мистическая
  • от 136 до 150 - Эпическая
  • от 151 до 155 - Легендарная

Естественно последовательность чисел можно менять и, например, для Легендарной сравнивать с числами вроде 33, 111, 145, 1, 7. Для остальных задать свои числа

Что сказать про:

Например в будущем Категории предметов могут увеличиться, а шансы поменяться.

Создайте класс Category в нем должно быть свойство Chance(Шанс), далее берем все категории и суммируем "шансы", получаем верхний порог генерации чисел

Для

Например обычный сундук имеет 10 ячеек, и в этом сундуке может выпасть 10 рандомных предмета.

можно в цикле для каждой ячейки вызывать код, который будет возвращать предмет

UPD

class Category {
    private int[] chanceValues;
    public Category(string name, int chance){
        Name = name;
        Chance = chance;
        chanceValues = generateChanceValues(chance);
    }
    public string Name { get; private set; }
    public int Chance { get; private set; }
    private int[] generateChanceValues(int count){
        int[] res = new int[count];
        Random random = new Random();
        for (int i = 0; i < count; count++){
            res[i] = random.Next(100) + 1;
        }
        return res;
    }
    public bool IsGenerateLoot(int number){
        if (chanceValues == null)
            return false;
        return chanceValues.Contains(number);
    }
}
READ ALSO
В чем различие между ReadLine() и ReadExisting() у COM-Port&#39;а

В чем различие между ReadLine() и ReadExisting() у COM-Port'а

Необходимо считывать данные с COM-портаОбычно рекомендуют пользоваться методом ReadLine()

458
Не понятен смысл DI

Не понятен смысл DI

Мне не до конца понятен смысл использование DI (например autofac)Возможно, я не правильно трактую его смысл из-за неверной области применения

366
CQRS. Что является Command?

CQRS. Что является Command?

Какова область ответственности command? Например, регистрация пользователя :

348
Использование RegExp в JSON Schema

Использование RegExp в JSON Schema

Имеется JSON Schema, которая описывает массив директорий в JSON файлеДиректории могут содержать абсолютные локальные пути, либо быть в UNC формате...

422