Ошибка в Unity, не появляется кнопка UI
было дело так:
я пытался создать скрипт и небольшую панель для отображения данных, но по неизвестной причине, ни как не связанной с тем что я делал, вдруг появилась ошибка
NullReferenceException: Object reference not set to an instance of an object
UIManager.Awake () (at Assets/UIManager.cs:30)
понятно что она отсылает к скрипту, вот и он, но не понятно в чем проблема конкретно
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIManager : MonoBehaviour
{
private BuildingPlacer _buildingPlacer;
public Transform buildingMenu;
public GameObject buildingButtonPrefab;
public Transform resourcesUIParent;
public GameObject gameResourceDisplayPrefab;
private Dictionary<string, Text> _resourceTexts;
private Dictionary<string, Button> _buildingButtons;
private void Awake()
{
_resourceTexts = new Dictionary<string, Text>();
foreach (KeyValuePair<string, GameResource> pair in Globals.GAME _RESOURCES)
{
GameObject display = Instantiate(gameResourceDisplayPrefab, resourcesUIParent);
display.name = pair.Key;
_resourceTexts[pair.Key] = display.transform.Find("Text").GetComponent<Text>();
_SetResourceText(pair.Key, pair.Value.Amount);
}
_buildingPlacer = GetComponent<BuildingPlacer>();
_buildingButtons = new Dictionary<string, Button>();
for (int i = 0; i < Globals.BUILDING_DATA.Length; i++)
{
GameObject button = Instantiate(buildingButtonPrefab);
BuildingData data = Globals.BUILDING_DATA[i];
button.name = data.unitName;
button.transform.Find("Text").GetComponent<Text>().text = data.unitName;
Button b = button.GetComponent<Button>();
_AddBuildingButtonListener(b, i);
_buildingButtons[data.code] = b;
if (!Globals.BUILDING_DATA[i].CanBuy())
{
b.interactable = false;
}
}
}
private void _SetResourceText(string resource, int value)
{
_resourceTexts[resource].text = value.ToString();
}
private void _AddBuildingButtonListener(Button b, int i)
{
b.onClick.AddListener(() => _buildingPlacer.SelectPlacedBuilding(i));
}
public void CheckBuildingButtons()
{
foreach (BuildingData data in Globals.BUILDING_DATA)
{
_buildingButtons[data.code].interactable = data.CanBuy();
}
}
private void OnEnable()
{
EventManager.AddListener("UpdateResourceTexts", _OnUpdateResourceTexts);
EventManager.AddListener("CheckBuildingButtons", _OnCheckBuildingButtons);
}
private void OnDisable()
{
EventManager.RemoveListener("UpdateResourceTexts", _OnUpdateResourceTexts);
EventManager.RemoveListener("CheckBuildingButtons", _OnCheckBuildingButtons);
}
private void _OnCheckBuildingButtons()
{
foreach (BuildingData data in Globals.BUILDING_DATA)
_buildingButtons[data.code].interactable = data.CanBuy();
}
}
Ошибки типа NullReferenceException возникают, когда вы пытаетесь обратиться к объекту, который не существует. В вашем случае, ошибка указывает на строку 30 в файле UIManager.cs. Похоже, что одна из переменных в этой строке не была инициализирована или не ссылается на объект. Проверьте эту строку и убедитесь, что все переменные инициализированы и имеют ссылку на объект. Если вы не уверены, как это сделать, вы можете добавить проверку на null перед использованием переменной или использовать блоки try/catch для обработки исключений.