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

Присвоение логического значения в методе не работает

Я сделал небольшую аркадную игру, в которой логическая переменная отслеживает, окончена игра или нет (gameOver).

private bool gameOver;

Когда препятствие сталкивается с игроком, выполняется следующий метод:

public void OnCollisionEnter2D(Collision2D other)
{
    //GameOver
    gameOver = true;
}

Следующий метод должен увеличивать счет, только если значение gameOver равно false.

private void OnTriggerEnter2D(Collider2D other)
{
    if (!gameOver)
    {
        if (int.Parse(scoreText.text) == 0)
        {
            scoreText.text = "1";
        }
        else if (int.Parse(scoreText.text) > 0)
        {
            int oldNumber = int.Parse(scoreText.text);
            int newNumber = oldNumber + 1;
            scoreText.text = newNumber.ToString();
        }
    }
    Destroy(gameObject);
}

Но когда игра фактически «проиграна», счет продолжает расти. Я регистрировал значение gameOver в разное время, и кажется, что для значения gameOver установлено значение true в методе OnCollisionEnter2D, но при входе в метод OnTriggerEnter2D оно говорит false. Я попытался присвоить значение отдельным методом с ключевым словом out, но это тоже не сработало. Может кто-нибудь мне помочь? Заранее спасибо.

04.03.2019

  • Какой метод запускается первым? Это OnCollisionEnter2D или OnTriggerEnter2D? 04.03.2019
  • Похоже, ваши события запускаются в обратном порядке, сначала Enter2D, а затем Collision. 04.03.2019
  • Вы пытались сделать его статичным? Вы, вероятно, создаете новый экземпляр класса, когда происходит новая игра, и он устанавливается по умолчанию. 04.03.2019
  • @Reniuz/HimBromBeere, согласно руководству, сначала вызывается OnTriggerXXX, а затем OnCollisionXXX. 04.03.2019
  • @jdweng Использование static в Unity — не лучшая идея, и обычно это означает, что вы не знаете, как правильно работать с Unity. У нас здесь недостаточно информации, но правильный способ — иметь какой-то класс, который существует до тех пор, пока поле static должно существовать, что может быть до тех пор, пока игра не будет закрыта. 04.03.2019

Ответы:


1

Вы не изменили bool gameOver в глобальном состоянии, и только одно препятствие знает, что вы проиграли. Самое простое решение:

private static bool gameOver;

Другое решение — хранить gameOver в синглтоне GameManager, если вы его используете.

Вы также можете сохранить это состояние в одном статическом классе:

public static class GameStates
{
    public static bool IsGameOver = false;
    public static int Score = 0;
    //other global states
}

И пользуйтесь без проблем:

if (!GameStates.IsGameOver)
{
    //do something
}

Если вы не хотите использовать static (это не лучшее решение в единстве) - используйте singleton (не делайте сложную архитектуру для маленькой игры)

04.03.2019
  • Спасибо, это сработало! Я думаю, что это звучит как глупый вопрос, но как мне сделать синглтон? 04.03.2019
  • @TitanTomato Singleton — это просто шаблон проектирования, с помощью которого вы гарантируете, что существует только один экземпляр данного класса. Как это сделать, зависит от реализации. 04.03.2019
  • @TitanTomato, вы можете использовать этот github.com/caxapexac/UnityTemplates/blob /мастер/Скрипты/ 04.03.2019
  • Новые материалы

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

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

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

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

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

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

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