У меня есть сценарий 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 - возвращает true
Код: Выделить всё
CanInteract() - Нажатие E работает
- Но ui.Show() никогда не вызывается (или не имеет видимого эффекта)
Будем очень благодарны за любую помощь
Подробнее здесь: https://stackoverflow.com/questions/798 ... tion-works
Мобильная версия