Unity3d UnassignedReferenceException префаб "теряется" в рантайме

Столкнулся с весьма неприятной проблемой. Добавляю 3 ссылки на объекты:

ContentContainer - Находится в сцене перед билдом

ViewportContainer - Находится в сцене перед билдом

ItemPrefab - Находится в ресурсах, как видно из скрина, перед билдом ссылка на него есть

введите сюда описание изображения

Далее, делаю вот такой код:

/// <summary>
/// Простая сумка
/// </summary>
public class Bag : AbstractBag
{

    [SerializeField] private int cellSizeX;
    [SerializeField] private int cellSizeY;

    [SerializeField] private RectTransform contentContainer;
    [SerializeField] private RectTransform viewportContainer;

    [SerializeField] private GameObject itemPrefab;

    private void Start()
    {
        Items.Clear();
        Items.Add(ResourceFactory.Instance.Create(DataDictionary.Resources.IRON, 10));
        Items.Add(ResourceFactory.Instance.Create(DataDictionary.Resources.WOOD, 7));
        Redraw();
    }

    public override void Redraw()
    {
        int flatIndex = 0;
        foreach (var item in Items)
            CreateItem(item, flatIndex++);
    }

    private AbstractItem CreateItem(IItem item, int flatIndex)
    {
        Debug.Log("prefab: " + (itemPrefab == null ? "null" : "ok"));
        Debug.Log("indx: " + flatIndex);
        return null;
    }

}

При загрузки сцены я вызываю перерисовку гуя, далее, ожидаю что в теле метода CreateItem будут доступны все объекты на которые я ссылался в редакторе unity

введите сюда описание изображения

Судя по логам - объект то есть, то его нет (смотреть на prefab: ok, и prefab: null), и вот этот момент для меня вообще шок. Что происходит?

Код абстрактной сумки, если нужно:

/// <summary>
/// Абстрактная сумка
/// </summary>
public abstract class AbstractBag : MonoBehaviour, IBag
{
    
    #region Hidden Fields
    
    private IList<IItem> items = new List<IItem>();
    
    #endregion
    
    #region Properties
    
    public IList<IItem> Items {
        get { return this.items; }
        set { this.items = value; }
    }

    #endregion

    /// <summary>
    /// Ширина всей видимой области инвентаря
    /// </summary>
    public abstract int FrameWidth { get; }

    /// <summary>
    /// Высота всей видимой области инвентаря
    /// </summary>
    public abstract int FrameHeight { get; }

    /// <summary>
    /// Количество ячеек умещающихся в ширину инвентаря
    /// </summary>
    public abstract int CellCountX { get; }

    /// <summary>
    ///  Количество ячеек умещающихся в высоту инвентаря
    /// </summary>
    public abstract int CellCountY { get; }

    /// <summary>
    /// Перестраивает гуи сумки
    /// </summary>
    public abstract void Redraw();
    
}

Версия Unity: введите сюда описание изображения


Ответы (1 шт):

Автор решения: Максим Фисман

В скрипте у вас идет определенный порядок вывода: 1) префаб, 2) индекс. Третий и четвертый вывод в консоли нарушают этот порядок, что говорит о том, что на сцене могут быть и другие объекты со скриптом Bag. Эту идею также подтверждает то, что вы никак не изменяете и вообще не трогаете переменную префаба, но она резко меняет значение.

Проверьте, что на сцене у вас больше нет объектов со скриптом Bag (возможно, два Bag висят на основном объекте), в которых не проинициализирован префаб.


→ Ссылка