Приглашение к взаимодействию с пользовательским интерфейсом не отображается, хотя взаимодействие работаетC#

Место общения программистов C#
Ответить
Anonymous
 Приглашение к взаимодействию с пользовательским интерфейсом не отображается, хотя взаимодействие работает

Сообщение Anonymous »

Я разрабатываю игру в Unity и застрял над проблемой, которую отлаживал почти два дня.
У меня есть сценарий LockedDoor, который позволяет игроку взаимодействовать с дверью, нажав E.

Само взаимодействие работает правильно (запуск диалога, открытие дверей и т. д.), но приглашение к взаимодействию пользовательского интерфейса никогда не отображается.
Странно то, что:
  • Я использую точно такую же логику в других скриптах (диалоги, переходы между сценами)
  • В этих скриптах пользовательский интерфейс работает отлично
  • Здесь строка вообще не появляется
Я проверил, что:
  • Игрок правильно вводит триггер
  • Нажатие E работает
  • Проблема не в локализации (я даже добавил резервную строку отладки)
  • Слои и коллайдеры правильно
  • Принудительное использование ui.target вручную тоже не помогло
Приведенный ниже код никогда не выполняется, хотя условия должны соблюдаться.

Код: Выделить всё

if (ui.target == null || ui.target == this.transform)
{
ui.target = this.transform;
ui.Show(GetInteractionPrompt());
}
Обновление

Код: Выделить всё

private void Update()
{
if (isOpened) return;

if (playerInRange)
{
bool canInteractNow = CanInteract();
var ui = Inventory.UI.UIInteractionPrompt.Instance;

if (ui == null) return;

if (canInteractNow)
{
if (ui.target == null || ui.target == this.transform)
{
ui.target = this.transform;
ui.Show(GetInteractionPrompt());
}

if (Keyboard.current.eKey.wasPressedThisFrame)
{
CheckKey();
}
}
else
{
if (ui.target == this.transform)
{
ui.Hide();
ui.target = null;
}
}
}
}
Проверка взаимодействия

Код: Выделить всё

public bool CanInteract()
{
if (isOpened) return false;

if (DialogueManager.Instance != null &&
!DialogueManager.Instance.CanStartDialogue())
return false;

if (Documents.DocumentManager.Instance != null &&
!Documents.DocumentManager.Instance.CanStartInteraction())
return false;

if (!requireSpecificDirection)
return true;

return IsPlayerInCorrectDirection();
}
Обнаружение триггера

Код: Выделить всё

private void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
playerInRange = true;
playerTransform = other.transform;
}
}

private void OnTriggerExit2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
playerInRange = false;

var ui = Inventory.UI.UIInteractionPrompt.Instance;
if (ui != null && ui.target == this.transform)
{
ui.Hide();
ui.target = null;
}
}
}
Приглашение к взаимодействию

Код: Выделить всё

public string GetInteractionPrompt()
{
string localized = interactionPrompt.GetLocalizedString();
if (string.IsNullOrEmpty(localized))
return "DEBUG: TEST PORTA";

return localized;
}
Чего я не понимаю
  • Та же система подсказок взаимодействия с пользовательским интерфейсом работает и в других скриптах
  • Код: Выделить всё

    playerInRange
    верно
  • Код: Выделить всё

    CanInteract()
    возвращает true
  • Нажатие E работает
  • Но ui.Show() никогда не вызывается (или не имеет видимого эффекта)
Что может помешать этому пользовательскому интерфейсу отображать только в этом скрипте, хотя логика такая идентичны?
Будем очень благодарны за любую помощь 🙏>

Подробнее здесь: https://stackoverflow.com/questions/798 ... tion-works
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»