Ты делаешь сундук с лутом. Меч должен выпадать в 60% случаев, зелье — в 30%, легендарный топор — в 10%.
Первая мысль —
Random.Range(0, 10) и куча if. Работает, но превращается в ад при изменении баланса.Есть чище. Кладёшь все веса в массив и суммируешь их нарастающим итогом — это кумулятивный вес. Потом кидаешь одно случайное число от 0 до суммы всех весов и смотришь, в какой «отрезок» оно попало.
int[] weights = { 60, 30, 10 }; // меч, зелье, топор
string[] items = { "Меч", "Зелье", "Топор" };
int GetWeightedRandom()
{
int total = 0;
foreach (int w in weights) total += w;
int roll = Random.Range(0, total);
int cumulative = 0;
for (int i = 0; i < weights.Length; i++)
{
cumulative += weights[i];
if (roll < cumulative) return i;
}
return weights.Length - 1;
}
Хочешь добавить новый предмет — просто добавляешь одно число в массив. Хочешь изменить баланс — меняешь одно число. Никаких
if.Веса не обязаны суммироваться в 100 — это просто удобство. Можно писать
{ 6, 3, 1 } или { 600, 300, 100 } — результат одинаковый.#мат_геймдев #БыстрыйМат #рандом #геймдев