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();
}
Ответы (1 шт):
В скрипте у вас идет определенный порядок вывода: 1) префаб, 2) индекс. Третий и четвертый вывод в консоли нарушают этот порядок, что говорит о том, что на сцене могут быть и другие объекты со скриптом Bag. Эту идею также подтверждает то, что вы никак не изменяете и вообще не трогаете переменную префаба, но она резко меняет значение.
Проверьте, что на сцене у вас больше нет объектов со скриптом Bag (возможно, два Bag висят на основном объекте), в которых не проинициализирован префаб.


