Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,217

Шанс выпадения объектов

21.12.2025, 14:01. Показов 425. Ответов 6

Студворк — интернет-сервис помощи студентам
Допустим есть три объекта. распространенный, дефицитный и редкий.
каким образом при открытии сундука например, организовать шансы выпадения этих объектов по степени редкости.
пусть выпадает какой-то один.
теоретически я представляю себе так:

создаем класс Item с значением шанса (int) и методом возвращающим bool, вычисляемым шанс. если шанс выпал возвращаем true, если не выпал возвращаем false. навешиваем им этот компонент.

помещаем их в массив. в каждом объекте задаем степень шанса (от 1 до 99%, ну или 100. поправьте этот момент если что).
в нужный момент вызываем у каждого Item метод и получаем bool. и вот с этого момента у меня затык.
как выбрать что создать ? отсортировать массив по убыванию заданного шанса и при выпадении true создавать первый?
в общем немного запутался.
а если их нужно будет создать три например с шансом выпадения?
возможно моя стратегия не совсем подходит.

Добавлено через 7 минут
можно конечно по разному подойти к этому. например каждому сундуку сразу заполнять массив с объектами и пусть они их выплевывают, каждый свои. и это довольно управляемый и творческий подход.
но интересует пока что моя задача. с элементом рандомности.

Добавлено через 1 минуту
и редких объектов должно выпадать в меньшем колличестве. например самый редкий объект, будет в сундуке один.
можно как-то автоматизировать такую задачу ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.12.2025, 14:01
Ответы с готовыми решениями:

Как сделать правильный рандом выпадения скинов?
Я новичок в Unity, пытаюсь сделать так чтобы когда вы открывали коробку, то выпадали скины...

В общем как заменить в подборе объектов и так чтобы не сохранял в массив объектов а в лист? с#
Вот код.public static RaycastHit rch; int _my_podbor_switch; public GameObject...

Массив дочерних объектов дочерних объектов
Есть родитель, у которого n детей, у 2-5 дочерних объектов есть по одному дочернему объекту. Мне...

6
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6186 / 2888 / 1042
Регистрация: 01.06.2021
Сообщений: 10,593
21.12.2025, 16:43
Gammister если при открытии сундука обязательно должен выпасть один из этих трех объектов, то тогда нужно иметь в виду, что сумма вероятностей выпадения этих объектов должна быть равной 1 (или 100%, если в процентах).

А что касается, как все это организовать в коде, то очень просто:
Допустим вероятность выпадения объекта A равна 60% (распространённый), объекта B - 30% (дефицитный), а объекта C - 10% (редкий).
Тогда можешь каждый раз, когда нужно открывать сундук, генерировать рандомное число p до 100 (или можно до 1 в действительных числах).
И потом пишешь так:
if (p < 60) A;
else if (p < 90) B; // 60+30
else C;

Если же количество объектов в сундуке ограничено, то в случае, если выпал C, но объекты этого типа уже закончились, то тогда можешь просто выдать B, а если нет B, то тогда A.
1
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,217
21.12.2025, 20:09  [ТС]
то есть, при запросе каждого объекта, если их нужно не один, а несколько, генерить число и основываясь на нем брать из массива объект, шанс которого в этом пределе. правильно?

сейчас сам базовый айтем на первой стадии у меня выглядит так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ItemBase : MonoBehaviour
{
    [SerializeField] string Name = "ItemBase";
 
    [SerializeField, Range(1, 101)] int ShanceSetup;
 
    [SerializeField] bool ShanceResult = false;
 
 
    [ContextMenu("Расчитать шанс")]
    public bool ShanceCalculate()
    {
        int random = Random.Range(1, 101);    
        return ShanceResult = random <= ShanceSetup;
    }
}
возможно я не правильно начал его проектировать. можно такой вариант использовать, опираясь на его булевый флаг в массиве?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6186 / 2888 / 1042
Регистрация: 01.06.2021
Сообщений: 10,593
21.12.2025, 21:16
Цитата Сообщение от Gammister Посмотреть сообщение
создаем класс Item с значением шанса (int) и методом возвращающим bool, вычисляемым шанс. если шанс выпал возвращаем true, если не выпал возвращаем false. навешиваем им этот компонент.
помещаем их в массив. в каждом объекте задаем степень шанса (от 1 до 99%, ну или 100. поправьте этот момент если что).
1. Я бы поместил все типы объектов в массив и потом функция возвращала бы не true/false, а индекс массива.

2. Если даже и устанавливать для каждого объекта вероятность, тогда придется нормализировать значение так, чтобы сумма вероятностей была равна 100%, либо нужно генерировать число в диапазоне, равному сумме вероятностей.

Например, у тебя есть объект А и ты выставил вероятность 80%. Объекту В - 60%, объекту С - 40%. Сумма получается 180%. Соответственно, либо нормализируешь все три вероятности, либо генерируешь рандомное число от 0 до 180.
0
 Аватар для 7533620
163 / 70 / 39
Регистрация: 28.05.2019
Сообщений: 242
21.12.2025, 21:45
Python
1
2
3
4
5
6
7
# Так можно
items = [("common", 60), ("rare", 90), ("very_rare", 100)]
def get_random_item():
    x = random(0, 100)
    for item, prob in items:
        if x <= prob:
            return item
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6186 / 2888 / 1042
Регистрация: 01.06.2021
Сообщений: 10,593
21.12.2025, 22:07
Цитата Сообщение от 7533620 Посмотреть сообщение
items = [("common", 60), ("rare", 90), ("very_rare", 100)]
да, это то, что я описывал здесь, только цикл вместо if

Цитата Сообщение от Royal_X Посмотреть сообщение
if (p < 60) A;
else if (p < 90) B; // 60+30
else C;
но ТС хотел указывать именно вероятности

Цитата Сообщение от Gammister Посмотреть сообщение
в каждом объекте задаем степень шанса (от 1 до 99%
1
399 / 308 / 104
Регистрация: 07.05.2017
Сообщений: 2,217
21.12.2025, 23:57  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
Сумма получается 180%. Соответственно, либо нормализируешь все три вероятности, либо генерируешь рандомное число от 0 до 180.
интересненько! спасибо.
задачка довольно забавная.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.12.2025, 23:57
Помогаю со студенческими работами здесь

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

Как прикрепить линию к объекту и провести к другому объекту?
Привет. Вот вариант с помощью метода Gizmos.DrawLine. Как видите линия проходит с центра одного...

Удалить все объекты и создать объекты - потомки
Как сделать клоны объекта в другом объекте? Использую метод Instantiate Есть метод public...

Вращение объекта вокруг другого объекта
Как сделать вращение объекта вокруг другого объекта? Например: создаём куб, затем внутри него...

Можно ли вызвать метод одного объекта через метод другого объекта?
Мне нужно сделать так, чтобы при вызове метода OnMouseDown() Первого объекта вызывался метод...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru