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;
}