#c# #unity3d
#c# #unity-игровой движок
Вопрос:
Это скриншот редактора:
Это скриншот сборки:
Как вы можете видеть, имя статистики появляется, когда я запускаю его в редакторе, но когда я его собираю, оно не отображается в приложении. В чем может быть причина?
Ниже приведен сценарий для всплывающей подсказки на скриншоте.
using System.Text;
using UnityEngine.UI;
using CharacterStats;
using UnityEngine;
public class StatTooltip : MonoBehaviour
{
[SerializeField] Text StatNameText;
[SerializeField] Text StatModifierLabelText;
[SerializeField] Text StatModifiersText;
private StringBuilder sb = new StringBuilder();
public void ShowTooltip(CharacterStat stat, string statName)
{
StatNameText.text = GetStatTopText(stat, statName);
StatModifiersText.text = GetStatModifiersText(stat);
gameObject.SetActive(true);
}
public void HideTooltip()
{
gameObject.SetActive(false);
}
private string GetStatTopText(CharacterStat stat, string statName)
{
sb.Length = 0;
sb.Append(statName);
sb.Append(" ");
sb.Append(stat.Value);
sb.Append(" (");
sb.Append(stat.BaseValue);
if (stat.Value > stat.BaseValue)
sb.Append(" ");
sb.Append(stat.Value - stat.BaseValue);
sb.Append(")");
return sb.ToString();
}
private string GetStatModifiersText(CharacterStat stat)
{
sb.Length = 0;
foreach (StatModifier mod in stat.StatModifiers)
{
if (sb.Length > 0)
{
sb.AppendLine();
}
if (mod.Value > 0)
sb.Append(" ");
sb.Append(mod.Value);
EquippableItem item = mod.Source as EquippableItem;
if(item != null)
{
sb.Append(" ");
sb.Append(item.ItemName);
}
else
{
Debug.LogError("Modifier is not an EquippableItem");
}
}
return sb.ToString();
}
}
statName отображается правильно в редакторе, но не в сборке.
using CharacterStats;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class StatDisplay : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
private CharacterStat _stat;
public CharacterStat Stat
{
get { return _stat; }
set
{
_stat = value;
UpdateStatValue();
}
}
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
nameText.text = _name;
}
}
[SerializeField] Text nameText;
[SerializeField] Text valueText;
[SerializeField] StatTooltip tooltip;
private void OnValidate()
{
Text[] texts = GetComponentsInChildren<Text>();
nameText = texts[0];
valueText = texts[1];
if (tooltip == null)
tooltip = FindObjectOfType<StatTooltip>();
}
public void OnPointerEnter(PointerEventData eventData)
{
tooltip.ShowTooltip(Stat, Name);
}
public void OnPointerExit(PointerEventData eventData)
{
tooltip.HideTooltip();
}
public void UpdateStatValue()
{
valueText.text = _stat.Value.ToString();
}
}
Комментарии:
1. Можете ли вы поделиться скриптом, который изменяет выходные данные?
2. Questland? Я играл в эту игру 🙂 Также я заметил, что оснащенный меч отличается на скриншотах
3. @AliKanat Я поделился сценарием .
4. @Morasiu Нет, я следую руководству Kryzarel на youtube. Однако элементы отличаются.
5. Вы проверили файлы журнала , есть ли в вашей сборке какое-либо исключение, которое не было перехвачено. Потому что код выглядит нормально для меня.
Ответ №1:
попробуйте установить «Режим масштабирования пользовательского интерфейса» в «Canvas Scaler» на «Масштабирование по размеру экрана»!
Редактировать: маловероятно, что это ошибка, но я не смог увидеть настройку на скриншоте, и, возможно, стоит попробовать, если вы еще этого не сделали
Комментарии:
1. На самом деле это не решает вопрос. Поскольку остальная часть пользовательского интерфейса масштабируется правильно, я бы сказал, что вероятность того, что это как-то связано с этим, довольно мала 😉
2. Для него установлено значение «Масштабировать только в соответствии с размером экрана». Проблема не в этом.
Ответ №2:
Проблема вызвана тем, что вы используете OnValidate
для инициализации tooltip
. Насколько я знаю OnValidate
, используется для проверки значений при их изменении в редакторе. Следовательно, это не работает в вашей сборке. Вместо этого вы должны использовать Awake
для инициализации.
Комментарии:
1. Я сделал это, и проблема не была исправлена. я думаю, что это как-то связано с именем состояния, а не с всплывающей подсказкой в целом. поскольку не отображается только statName. Но не могу найти причину.
2. Вы переместили все в OnValidate в Awake или просто во всплывающую подсказку? Вы должны переместить все. Есть ли какие-либо другие исключения?