При вызове функции из скрипта GameManager появляется следующая ошибка «NullReferenceException» - PullRequest
0 голосов
/ 05 августа 2020

Я делаю курс по удеми. В уроке объясняется, как запустить функцию, которая останавливает движение мира, когда игрок сталкивается с опасностью. Я скопировал его точно так, как показано в классе.

Это сценарий «PlayerController», у которого есть триггер для вызова функции, останавливающей движение мира.

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

public class PlayerController : MonoBehaviour

{
    public GameManager theGM;
    
    // Start is called before the first frame update
    void Start()
    {
    
    }

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

    
    public void OnTriggerEnter(Collider other) {
        if (other.tag == "Hazards") {
            Debug.Log("Hit Hazard");
            theGM.HitHazard();
        }
    }
}

А это " GameManager », который содержит функцию, останавливающую движение мира.

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

public class GameManager : MonoBehaviour
{
    public bool canMove;
    static public bool _canMove;
    public float worldSpeed;
    static public float _worldSpeed;    
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        _canMove = canMove;
        _worldSpeed = worldSpeed;   
    }

    public void HitHazard() {
        _canMove = false;
        canMove = false;
    }
}

Когда игрок сталкивается с опасностью, он запускает функцию« OnTriggerEnter », она показывает на консоли, что игрок попал в опасность, но когда он пытается вызвать функцию «HitHazard», появляется следующая ошибка: «NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта».

Уже пытался переписать оба кода и искать в inte rnet , но все равно не смог решить.

Ответы [ 3 ]

0 голосов
/ 06 августа 2020

NullReferenceException означает, что поле, к которому вы пытаетесь получить доступ, является нулевым, Unity регистрирует строки, где это происходит, обычно записывается как FunctionPath (at file: xx)

xx - Строка, где это произошло.

file = Путь к файлу в папке Assets.

Вы можете исправить это разными способами, вот два.

  1. Сделайте Awake функцию с кодом, который добавляет GameManager Component активному GameObject:
void Awake()
{
   theGM = base.AddComponent<GameManager>();
}
Добавьте GameManager Component к GameObject в Unity и назначьте его полю theGM
0 голосов
/ 06 августа 2020

Спасибо, ребята. Проблема заключалась в том, что я не установил GameManager в инспекторе. Я попытался добавить его в поле объекта в инспекторе, но ошибка все равно продолжалась, я думаю, потому что я что-то изменил в коде, пытаясь исправить. Поэтому я снова переписал код и добавил объект GameManager в Инспектор, теперь он работает.

public class PlayerController : MonoBehaviour

{
    public GameManager theGM;
    
    // Start is called before the first frame update
    void Start()
    {
        
    }

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

    
    public void OnTriggerEnter(Collider other) {
        if (other.tag == "Hazards") {
            Debug.Log("Hit Hazard");
            theGM.HitHazard();
        }
    }
}
0 голосов
/ 05 августа 2020

Исключение NullReferenceException возникает, когда вы пытаетесь получить доступ к чему-либо (полю / свойству / методу) в пустом экземпляре.

object obj = null;
obj.Something(); // <<< NullReferenceException is throwed

В единстве вы можете получить дополнительную информацию (имя файла и номер строки): 1

Изменить: в вашем коде единственное, что может быть нулевым, - это ваша ссылка GameManager «theGM» в вашем PlayerController. Попробуйте правильно привязать его в редакторе, или используйте шаблон Singleton.

Надеюсь, я вам помог

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...