Ошибка «Ссылка на объект не установлена ​​на экземпляр объекта» при работе с prefab - PullRequest
1 голос
/ 17 июня 2019

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

Мой скрипт камеры (ошибка в строке offset = transform.position - Game.currentPlayer.transform.position;):

public class CameraControl : MonoBehaviour
{
    private Vector3 offset;

    private void Awake()
    {
        offset = transform.position - Game.currentPlayer.transform.position;
    }

    void LateUpdate()
    {
        transform.position = Game.currentPlayer.transform.position + offset;
    }
}

Я установил мою currentPlayer переменную здесь:

void Start()
    {
        GameObject newPlayer = Instantiate(player,transform.position,transform.rotation);
        newPlayer.name = "Player";
        currentPlayer = newPlayer;
    }

Если вам нужно больше скриптов, чтобы помочь, просто спросите:)

1 Ответ

1 голос
/ 17 июня 2019

Awake вызывается раньше Start. На самом деле даже все Awake методы завершены до того, как будет вызван первый Start (см. Также Order of Execution for Event Functions).

Следовательно, ссылка еще не установлена ​​в Awake.

Вам придется либо переместить его в метод Start, либо переместить часть создания экземпляра в Awake.

В обоих случаях все еще не гарантируется, что сценарий Game будет иметь Start, выполненный до GameControl. Поэтому вам все равно придется настроить Порядок выполнения скриптов , чтобы Game всегда выполнялось до GameControl. Просто

  • откройте Правка> Настройки проекта> Порядок выполнения скрипта
  • перетаскивайте сценарий Game перед блоком DefaultTime
  • опционально также сортирует уже существующие элементы

В качестве альтернативы вы можете использовать систему событий:

public class Game : MonoBehaviour
{
    public static event Action OnInitilalized;

    public static GameObject currentPlayer;

    privtae void Start()
    {
        GameObject newPlayer = Instantiate(player,transform.position,transform.rotation);
        newPlayer.name = "Player";
        currentPlayer = newPlayer;

        OnInitilalized?.Invoke();
    }
}

и затем в GameControl добавьте обратный вызов к событию OnInitialized, например

private void Awake()
{
    // This makes sure the callback is added only once
    Game.OnInitialized -= OnGameInitialized;
    Game.OnInitialized += OnGameInitialized;
}

private void OnDestroy()
{
    // always make sure to remove callbacks if no longer needed
    Game.OnInitialized -= OnGameInitialized;
}

privtae void OnGameInitialized()
{
    offset = transform.position - Game.currentPlayer.transform.position;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...