Появился ооочень странный наполовину плавающий баг с мусорными строками.
Всю архитектуру описывать очень долго, поэтому напишу вкратце, но если будет надо, обновлю вопрос с детальным описанием.
В кратце так:
создал систему для локализации игры. Есть класс Localization со статическими строковыми полями только для чтения, и есть файл xml со строками. Данный клас, с помощью стандартного XmlTextReader и рефлексии, заполняет нужные поля соответствующими значениями.
Теперь при клике на предмет в инвентаре, берем его описание из соответствующих строк и показываем пользователю.
public override DescriptionItem[] GetStats()
{
List<DescriptionItem> res = new List<DescriptionItem>();
//...
res.Add(new DescriptionItem(Localization.baseDamage, WeaponDamage.BaseDamage.ToString()));
res.Add(new DescriptionItem(Localization.armourDamage, WeaponDamage.ArmourDamage.ToString()));
res.Add(new DescriptionItem(Localization.attackDistance, AttackDistance.ToString()));
return res.ToArray();
}
Вот так описание выводится пользователю:
public class TipsPanel : MonoBehaviour, IDragHandler, IBeginDragHandler
{
//...
[SerializeField] Text name;
[SerializeField] Text description;
[Space]
[SerializeField] Transform statsPanel;
[SerializeField] GameObject statsBlockOriginal;
public RectTransform ThisTransform { get; private set; }
public static TipsPanel Instance { get; private set; }
void Awake()
{
Instance = this;
ThisTransform = (RectTransform)transform;
gameObject.SetActive(false);
}
void SetDescriptionOf(IDescriptionable item)
{
for (int i = 0; i < statsPanel.childCount; i++)
Destroy(statsPanel.GetChild(i).gameObject);
Description desc = item.GetDescription();
name.text = desc.Name;
description.text = desc.Desc;
//...
if(desc.Stats != null)
{
foreach (DescriptionItem d in desc.Stats)
{
GameObject go = Instantiate(statsBlockOriginal, statsPanel);
StatsBlock sb = go.GetComponent<StatsBlock>();
sb.SetName(d.Name);
sb.SetValue(d.Description, d.ItPositiveDesc);
}
}
if (desc.Cost != null)
{
costPanel.alpha = 1;
cost.text = desc.Cost.ToString();
}
else
{
costPanel.alpha = 0;
}
}
//...
}
Вот код структуры DescriptionItem:
public struct DescriptionItem
{
public string Name { get; private set; }
public string Description { get; private set; }
/// <summary>
/// Влияет на отображение на панели простотра статов (TipsPanel)
/// </summary>
public bool ItPositiveDesc { get; private set; }
public DescriptionItem(string name, string description, bool itPisitiveDesc = true)
{
Name = name;
Description = description;
ItPositiveDesc = itPisitiveDesc;
}
}
Теперь самое интересное
При первом запуске уровня все работает нормально. Но при перезапуске уровня случается вот такая дичь:
Запускаем отладку и видим, что с классом локализации и значениями полей все нормально:
Пропускаем шаг отладки и видим, что, на самом деле, было передано "мусорное значение" строки.
Причем, это случается не просто при перезапуске уровня, но именно при перезапуске уровня, если на этот предмет уже кликали перед перезапуском уровня.
Подскажите пожалуйста, в чем может быть проблема. Хотя бы малейшие предположения. Возможно, кто то сталкивался с подобным (но такого и врагу не пожелаешь).
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости