Unity! IsDestroying () Ошибка

1

В Unity я в настоящее время получаю сообщение об ошибке, когда ни один из них не существовал раньше, или если они это сделали, похоже, не имеет значения.

Всякий раз, когда я что-то разрушаю и перехожу к перезапуску уровня в моей игре, игра замерзает частично в загрузке и возникает с этой ошибкой:

!IsDestroying()
UnityEngine.GameObject:AddComponent()
EggScript:OnDestroy() (at Assets/Scripts/GameScripts/EggScript.cs:85)

Функция, о которой он говорит:

void OnDestroy()
{
    PlayerPrefs.SetInt("Game Paused", 1);
    transform.parent.gameObject.transform.parent.gameObject.AddComponent<GameOverScript>();
}

Я удалил вызов PlayerPrefs без видимых изменений, но мне нужен другой вызов, чтобы фактически перезапустить уровень.

Другая ошибка, которая, по-видимому, не имеет значения, такова:

batchDelete.reservedObjectCount >= batchDelete.objectCount

Я не совсем уверен, где я создаю это, потому что то, над чем я работаю, - это немного конгломерат учебников, но я не думаю, что это относится к этой конкретной ошибке.

Код GameOverScript ниже (хотя это не похоже на ошибку):

void Start()
{
    GameManagerScript.Instance.pauseGame();
    //gameObject.BroadcastMessage("saveScore", null, SendMessageOptions.DontRequireReceiver);
    if (PlayerPrefs.GetString("curLevel") == "Tutorial" || PlayerPrefs.GetString("curLevel") == "Tutorial1" || PlayerPrefs.GetString("curLevel") == "Tutorial2")
    {
        //Do nothing
    }
    else
    {
        //We're in an infinite level, so we save the score
        gameObject.BroadcastMessage("saveScore");
    }

    PauseScript.displayMenu();
    //gameObject.AddComponent<FrontmostClickCheckerScript>();

    //HighScoreManager._instance.SaveHighScore("You", (System.Int32)PlayerPrefs.GetFloat("LatestScore"));
    HighScoreManager._instance.SaveHighScore("You", GameManagerScript.Instance.getScore());
}
  • 0
    Я сомневаюсь, что строка transform.parent.gameObject.transform.parent.gameObject.AddComponent<GameOverScript>(); вызывает проблему. Я подозреваю, что экземпляр GameObject , к которому вы обращаетесь, «заблокирован» на протяжении всего процесса уничтожения, хотя я не совсем уверен в этом. Что произойдет, если вы закомментируете эту строку внутри OnDestroy() ?
  • 0
    Я не думал об этом, я все еще могу сбросить сцену (только Application.LoadLevel) с помощью кнопки повтора, и у меня тот же результат - замороженная игра - но без каких-либо явных ошибок. Я немного повозился и обнаружил, что это, вероятно, мои экземпляры. Я следую за кодом здесь: unitypatterns.com/singletons это устарело?
Показать ещё 3 комментария
Теги:
unity3d
destroy

1 ответ

0
Лучший ответ

Я действительно считаю, что вы можете сделать несколько ошибок здесь:

  • transform.parent.gameObject.transform.parent.gameObject.AddComponent() следует заменить общедоступной переменной, чтобы удержать этот GameObject, вызывающий AddComponent на нем, а также заменить ваш AddComponent включенным, как было упомянуто в комментариях, также будет работать.

  • Вы уничтожаете объект при паузе. Вы должны опубликовать больше кода, чтобы дать контекст здесь, но вы не хотите использовать OnDestroy для управления состоянием игры, как кажется, что вы есть. Вы можете использовать обмен сообщениями или ссылки, последнее быстрее, но первое прекрасно, когда вы не используете его слишком часто (читайте: повторно в OnUpdate)

Я думаю, что самая вероятная возможность здесь - объект, который вы вызываете AddComponent, может быть уничтожен, когда вы пытаетесь добавить компонент. Было бы очень сложно отладить здесь, потому что вы поднимаетесь по иерархии вручную. Кроме того, попробуйте полностью удалить компонент AddComponent, похоже, вам нужно SetActive.

  • 0
    Похоже, это решило проблему, хотя еще одна важная проблема, которая была частью этого, заключалась в том, что я не разделял свои синглтоны на их собственные игровые объекты, которые могли сохраняться на разных уровнях / и т.д. Я изменил так много вещей, что теперь не уверен, что смогу отследить проблему до какой-либо одной основной причины, но ваше исправление определенно было большой частью, поэтому я отметил это как ответ. Спасибо за помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню