Допустим в начале игры каждый раз генерируется карта.
Генерация зависит от рандома.
Чтобы сделать генерацию повторяющууся используется одинаковый сид в начале генерации.
Для примера, после генерации наносится урон сущности, зависимый от рандома, и этот урон каждый раз будет одинаковый, т.к. перед генерацией использовался сид.
Пример:
spoilerRandom.InitState(10);
for (int i = 0; i < 3; i++)
{
Debug.Log($"GENERATION : {Random.Range(0f, 1f)}");
}
for (int i = 0; i < 3; i++)
{
Debug.Log($"SHOOT : {Random.Range(0f, 1f)}");
}
Вывод каждый раз одинаковый:
GENERATION : 0.2686557
GENERATION : 0.7817978
GENERATION : 0.9014543
SHOOT : 0.3051965
SHOOT : 0.8728517
SHOOT : 0.2956414
Как правильно сделать, чтобы этот урон не зависил от сида, который был установлен в начале генерации?
Было найдено решение, в котором перед генерацией (или перед первой установкой сида) мы генерируем сид для урона, который будет устанавливаться перед нанесением урона и обновляться на новый после урона, чтобы урон не повторялся, но данное решение не выглядит что-ли правильным и системным.
Пример:
spoilervar shootSeed = Random.Range(int.MinValue, int.MaxValue);
Random.InitState(10);
for (int i = 0; i < 3; i++)
{
Debug.Log($"GENERATION : {Random.Range(0f, 1f)}");
}
for (int i = 0; i < 3; i++)
{
Random.InitState(shootSeed);
Debug.Log($"SHOOT : {Random.Range(0f, 1f)}");
shootSeed = Random.Range(int.MinValue, int.MaxValue);
}
Выводы:
1)
GENERATION : 0.2686557
GENERATION : 0.7817978
GENERATION : 0.9014543
SHOT : 0.4784655
SHOT : 0.2666625
SHOT : 0.5826535
2)
GENERATION : 0.2686557
GENERATION : 0.7817978
GENERATION : 0.9014543
SHOT : 0.7529675
SHOT : 0.8416272
SHOT : 0.09183574
и т.д.
Вроде двигаюсь в верном направлении, но не до конца понимаю.
Еще остается вопрос как продолжить вызов рандома, зависимый от сида для генерации после стрельбы. Запоминать количество вызовов рандома для генерации, генерировать мусорные рандомы и потом получать нужное значение? Кажется что это оверхед.