Процедурное размещение объектов во время выполнения в Unity (C#)

Я хочу, чтобы в моей игре были камни, валяющиеся на местности. Затем игрок может забрать эти камни. Однако мой ландшафт довольно велик (около 5000x5000 в единицах измерения). Не думаю, что будет оптимальным размещать сотни (а то и тысячи) камней в качестве игровых объектов. Поскольку моя игра является многопользовательской, я не могу просто создавать экземпляры камней, когда игроки идут, потому что два игрока, приближающиеся друг к другу, увидят появление камней. Я также не могу добавлять камни к деревьям моего ландшафта и массово размещать их, потому что это будет противоречить моему сценарию рубки деревьев и вырубки.

Решением, на мой взгляд, было бы как-то процедурно разместить камни так, чтобы игроки не заметили. Это лучший способ сделать это? И если да, то как?

Мне не нужен какой-либо код, но если бы кто-нибудь мог просто обрисовать в общих чертах, как они подошли бы к этому, пожалуйста? Я не могу придумать лучший способ сделать это... Любые идеи были бы замечательными!


person Mingan Beyleveld    schedule 07.04.2015    source источник
comment
Вы должны генерировать камни на сервере?   -  person Ewan    schedule 07.04.2015
comment
Нет, если все игроки могут видеть одни и те же камни в одних и тех же позициях.   -  person Mingan Beyleveld    schedule 07.04.2015


Ответы (1)


Я сам перешагнул через эту проблему некоторое время назад. Я бы порекомендовал прочитать о «Линейных конгруэнтных генераторах» 1 .

Они используются для генерации псевдослучайных чисел. Но случайные числа зависят от заданного семени. Таким образом, если у всех игроков одинаковое семя, должна быть возможность генерировать камни, пока игроки ходят. Из-за одного и того же семени все игроки получат одно и то же случайное число в позиции x, y, и при этом все они будут генерировать один и тот же камень в одних и тех же местах.

person Plasher    schedule 07.04.2015
comment
Я думаю, вы все равно получите, что игрок A делает вывод о присутствии игрока B из-за того, что камни появляются за пределами проблемы расстояния отсечки игрока A. - person Ewan; 07.04.2015
comment
Не совсем уверен, правильно ли я вас понял. Вы имели в виду, что игрок А увидит игрока Б из-за камней, которые генерирует игрок Б? Моя идея заключалась в том, чтобы генерировать камни только на клиенте. Следовательно, игрок А будет генерировать свои камни, а игрок Б будет генерировать свои камни, но ни один из них не будет видеть камни друг друга. - person Plasher; 07.04.2015
comment
и тем не менее они все равно получат камень в том же месте. да думаю сработает. Именно так я интерпретировал я не могу просто создавать экземпляры камней, когда игроки ходят... немного - person Ewan; 07.04.2015
comment
Идеально! Таким образом, я могу создавать экземпляры камней на клиенте, а это означает, что никто не увидит, как генерируются камни друг друга, но их положение будет одинаковым из-за семени. Именно то, что я искал! - person Mingan Beyleveld; 07.04.2015
comment
ну, конечно, если камни должны быть чем-то большим, чем просто декорации (например, их можно собирать), то должна быть возможность их хранить. Если я правильно помню, майнкрафт делает это так: он генерирует мир на основе LCG и сохраняет только измененные (уничтоженные или измененные) блоки. Оператор также может сделать это и сохранить список собранных камней, а затем клиент может проверить, следует ли создавать экземпляр возможного камня в зависимости от этого списка. Но это всего лишь простая мысль. - person Plasher; 07.04.2015
comment
Я предполагаю, что эта проблема действительно связана с оптимизацией, поэтому нет идеального решения. - person Ewan; 07.04.2015