Nano Hash - криптовалюты, майнинг, программирование

Ошибка Unity! IsDestroying ()

В 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());
}
21.07.2014

  • Я сомневаюсь, что строка transform.parent.gameObject.transform.parent.gameObject.AddComponent<GameOverScript>(); вызывает проблему. Я подозреваю, что экземпляр GameObject, к которому вы обращаетесь, блокируется в течение всего процесса уничтожения, хотя я не совсем в этом уверен. Что произойдет, если вы закомментируете эту строку внутри OnDestroy()? 22.07.2014
  • Я не подумал об этом, я все еще могу сбросить сцену (просто Application.LoadLevel) с помощью кнопки повтора, и у меня тот же результат - зависшая игра, но без каких-либо явных ошибок. Я еще немного повозился и выяснил, что это, вероятно, мои экземпляры. Я следую приведенному здесь коду: unitypatterns.com/singletons это устарело? 22.07.2014
  • Вы можете попытаться присоединить изначально отключенный GameOverScript к GameObject, на который вы ссылаетесь в своем коде. Как только игра завершится и OnDestroy() выполнится, включите скрипт gameOverScript.enabled = true;. Но тогда ваш код в GameOverScript.Start должен быть перенесен в другую общедоступную функцию, чтобы вы могли позже вызвать эту функцию из своего игрового менеджера. 23.07.2014
  • Твердый совет, звучит похоже на то, что говорит Assorted Trailmix. Я обнаружил, что ошибка, с которой я столкнулся с экземплярами, заключалась в том, что у меня не было моих синглетонов под одним GameObject, которые могли бы оставаться постоянными. Таким образом, их родитель разрушался и вызывал проблемы. Я обновлю, если смогу заставить скрипт работать правильно. 23.07.2014
  • Кажется, снова работает хорошо, большое спасибо за вашу помощь! 23.07.2014

Ответы:


1

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

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

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

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

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

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..