Появился ооочень странный наполовину плавающий баг с мусорными строками.
Всю архитектуру описывать очень долго, поэтому напишу вкратце, но если будет надо, обновлю вопрос с детальным описанием.
В кратце так:
создал систему для локализации игры. Есть класс 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;
}
}
Теперь самое интересное
При первом запуске уровня все работает нормально. Но при перезапуске уровня случается вот такая дичь:
Запускаем отладку и видим, что с классом локализации и значениями полей все нормально:
Пропускаем шаг отладки и видим, что, на самом деле, было передано "мусорное значение" строки.
Причем, это случается не просто при перезапуске уровня, но именно при перезапуске уровня, если на этот предмет уже кликали перед перезапуском уровня.
Подскажите пожалуйста, в чем может быть проблема. Хотя бы малейшие предположения. Возможно, кто то сталкивался с подобным (но такого и врагу не пожелаешь).
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Столкнулся с данной проблемой при передачи функции из одной формы в другуюКак её решить?
Перешел на новый риббонПрикрепляю картинки на элементы интерфейса, но они отображаются только в запущенном приложении
Можно ли как-то в c# запустить процесс в процессе без создания нового процесса?
Для рассылки почты использовал достаточно простой метод отправки