Поскольку
public static event MazeReadyAction OnMazeReady;
равно static
, оно продолжает существовать, даже если будет существовать экземпляр этого класса, который будет уничтожен.
Так что после
MazeGenerator.OnMazeReady += StartDirectives;
этот слушатель продолжает вызываться, хотя объект MazeDirectives
, который вы зарегистрировали в качестве слушателя, разрушается из-за SceneManager.Load
.Так что в следующий раз, когда будет вызван OnMazeReady
, у вас на самом деле будет зарегистрировано два слушателя: один из первой сцены, которая сейчас уничтожена, и один из «новой» сцены.
Вы должны либо удалить старыйслушатель
private void OnDestroy()
{
MazeGenerator.OnMazeReady -= StartDirectives;
}
или даже не «складывает» их, а назначает только одного слушателя
private void Awake()
{
MazeGenerator.OnMazeReady = StartDirectives;
}
это, конечно, применимо, только если в вашей сцене нет другого слушателя.
В любом случае вы должны сбросить его, чтобы быть уверенным
private void OnDestroy()
{
MazeGenerator.OnMazeReady = null;
}
Общее примечание: всегда можно позвонить на
MazeGenerator.OnMazeReady -= StartDirectives;
, даже если слушатель не был добавлендо.Таким образом,
private void Awake()
{
MazeGenerator.OnMazeReady -= StartDirectives;
MazeGenerator.OnMazeReady += StartDirectives;
}
также гарантирует, что слушатель всегда может быть добавлен только один раз.