@WeBBeW

NullReferenceException: Object reference not set to an instance of an object почему?

Почему эту ошибку выводит?
Вот код:
Inventory

for(int i = 0; i < inventoryItems.Length;i++)
        {

            if(inventoryItems[i] != null) continue;
            inventoryItems[i] = it;
            print("item add - " + inventoryItems[i]);
            (new InventoryWindow()).Redraw();
        }


InventoryWindow

InventoryWindow

public class InventoryWindow : MonoBehaviour
{
    [SerializeField] public Inventory targetInventory;
    [SerializeField] public Transform itemsPanel;
    void Start()
    {
        Redraw();
    }
    void Update() 
    {
        if(Input.GetKeyDown(KeyCode.F))
            Redraw();
    }
    public void Redraw()
    {
        bool ChildNull = true;
        bool RemoveSprites = false;
        bool finish = false;
        while(finish != true)
        {
            print("z - " + itemsPanel.transform.childCount);
            if(itemsPanel.transform.childCount == 0) {ChildNull = true;}
            else if(itemsPanel.transform.childCount > 0) {ChildNull = false;}

            print("bool - " + ChildNull);
            if(ChildNull == true)//если спрайтов нету 
            {
                for(var i = 0; i < targetInventory.inventoryItems.Length; i++)
                {
                    if(targetInventory.inventoryItems[i] != null)
                    {
                        var item = targetInventory.inventoryItems[i];

                        GameObject icon = new GameObject("Icon");
                        icon.AddComponent<Image>().sprite = item.Icon;
                        icon.transform.SetParent(itemsPanel);
                        icon.transform.localScale = Vector3.one;
                    }
                } 
            }else//если есть 
            {
                if(RemoveSprites == false)
                {
                    for(int i = 0; i < itemsPanel.transform.childCount; i++)   
                    {
                        Destroy(itemsPanel.transform.GetChild(i).gameObject);
                        if(i == (itemsPanel.transform.childCount - 1)) RemoveSprites = true;
                    }
                }else if(RemoveSprites == true)
                {
                    for(var i = 0; i < targetInventory.inventoryItems.Length; i++)
                    {
                        if(targetInventory.inventoryItems[i] != null)
                        {
                            var item = targetInventory.inventoryItems[i];

                            GameObject icon = new GameObject("Icon");
                            icon.AddComponent<Image>().sprite = item.Icon;
                            icon.transform.SetParent(itemsPanel);
                            icon.transform.localScale = Vector3.one;
                        }
                        if(i == (targetInventory.inventoryItems.Length - 1)) finish = true;
                    }    
                }
            }
        }
    }
}


Ошибка на эту строчку :
print("z - " + itemsPanel.transform.childCount);
, но если убрать эту строчку, то на эту
if(itemsPanel.transform.childCount == 0) {ChildNull = true;}


Ошибку показывает если Redraw вызвать из Inventory, а если вызвать из InventoryWindow, то этой ошибки нету
  • Вопрос задан
  • 81 просмотр
Решения вопроса 1
CHIDWI
@CHIDWI
Изучаю C#, Unity3D
Во - первых использовать While -плохо.
Во - вторых ошибка NullReferenceException, означает что вы пытаетесь получить доступ к обьекту которого нет(null) или пуст, возможно вы его удалили или он еще не создан. Из описанного выплывает что в itemsPanel.transform.childCount - null(пусто). Как вариант можете написать так print("z - " + itemsPanel.transform?.childCount);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
(new InventoryWindow()).Redraw();

А ещё там должно быть написано, что не нужно ньюкать MonoBehaviour классы.

Но если вы так делаете, позаботьтесь, чтобы ваши SerializeField были заданы вами в вашем новом инстансе.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы