Хобрук: Ваш путь к мастерству в программировании

Изменение текста программным способом, чтобы показать счет в игре на экране в единстве

Я работал над простой 2D-игрой в единстве, и в ней всего три сцены: начальная сцена, игровая сцена и сцена окончания игры. Я хочу отображать счет игры на экране игры. Я создал игровой объект диспетчера очков в игровой сцене, который использует функцию DontDestroyOnLoad () для переноса его на экран завершения игры, и дал ему доступ к счету, которым управляет диспетчер игры. Я отлаживал свой код, и оценка переводится в диспетчер очков и сохраняется при загрузке игры поверх экрана, но по какой-то причине он не позволяет мне обновлять текстовый объект оценки. Вот мой код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ScoreManager : MonoBehaviour {

    public static ScoreManager Instance;

    private GameController gameController;

    private int scoreInstance;

    private Text scoreText;

    // When scene is first loaded
    void Awake() {

        this.InstantiateController();

    }

    // Use this for initialization
    void Start () {

        GameObject gameControllerObject = GameObject.FindWithTag("GameController");

        if (gameControllerObject != null)
        {
            gameController = gameControllerObject.GetComponent<GameController>();
        }

        GameObject scoreTextObject = GameObject.FindWithTag("ScoreText");

        if (scoreTextObject != null)
        {
            scoreText = scoreTextObject.GetComponent<Text>();
        }

        scoreInstance = 0;

        scoreText.text = "";

    }

    // Update is called once per frame
    void Update () {

        scoreInstance = gameController.score;
        Debug.Log("Score: " + scoreInstance.ToString());

        scoreText.text = scoreInstance.ToString();

    }

    private void InstantiateController ()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(this);
        }
        else if (this != Instance)
        {
            Destroy(this.gameObject);
        }
    }
}

Поэтому я попытался программно собрать компонент пользовательского интерфейса «текст партитуры» в функции запуска, потому что я решил, что не могу просто сделать его общедоступным и перетащить текстовый компонент, потому что диспетчер партитуры фактически находится в другой сцене, чем текстовый объект партитуры. Я также попытался добавить весь этот фрагмент кода, чтобы собрать текстовый компонент в функцию обновления, чтобы он мог это сделать, когда менеджер результатов фактически является частью экрана игры. Кажется, ничего не работает, и я понятия не имею, почему. Кто-нибудь может мне помочь с этим? Также я продолжаю получать ошибку «NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта». Заранее благодарю за любую помощь.

16.02.2017

  • Последняя строка метода запуска и все строки в Update могут давать нулевое исключение, поскольку вы не знаете, инициализированы ли объекты, но вы получаете доступ к их свойствам. Начните с отладки ваших GetComponents и посмотрите, не используется ли что-нибудь 16.02.2017
  • Спасибо! :) Я отлаживал оба GetComponents, и ошибка действительно была вызвана той же проблемой, из-за которой счет не обновлялся, используя метод, предложенный @JasonLang, также исправил мою ошибку NullReference. 16.02.2017

Ответы:


1

Функция Unity Start вызывается только при первом включении скрипта, то есть не каждый раз, когда сцена изменяется для объекта DontDestroyOnLoad.

Поэтому, если вам нужно подключить некоторые изменения после изменения сцены, вам нужно либо обнаружить изменение сцены, либо иметь объект, который запускается в этой сцене, запускать код, который вы хотите запустить.

Наличие другого объекта в новой сцене триггера - это просто и довольно надежно, но есть встроенная функция, которую вы можете добавить к другим вашим объектам:

void OnLevelWasLoaded(int currentLevel)
{
}

Он будет вызываться при смене уровня и давать вам номер уровня (к сожалению, не название). Однако вышеперечисленное устарело, и они хотят, чтобы вы использовали SceneManager Unity, поэтому правильный способ настроить это сейчас:

Unity 5 OnLevelWasLoaded?

Start()
{
    SceneManager.sceneLoaded += this.OnLoadCallback;
}

void OnLoadCallback(Scene scene, LoadSceneMode sceneMode)
{
    // you can query the name of the loaded scene here
}
16.02.2017
  • Отлично, это решило мою проблему. Я закончил тем, что использовал SceneManager Unity для проверки активной сцены, и когда она была равна игре за сценой, я запустил код GetComponent. Спасибо за помощь! :) 16.02.2017
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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