Потому что OnTriggerStay вызывается не каждый кадр. Отдели ввод игрока. WakeUp - костыль, которого не должно быть. Вот примерно то, что тебе надо:
public class KeyboardInput : MonoBehaviour, IPlayerInput
{
public event Action ActionButtonPressed;
private void Update()
{
if (Input.GetKeyDown(KeyCode.F))
{
ActionButtonPressed?.Invoke();
}
}
}
public interface IPlayerInput
{
public event Action ActionButtonPressed;
}
Отдельно инпут.
[RequireComponent(typeof(Collider2D))]
public class DialogueTrigger : MonoBehaviour
{
[SerializeField] private KeyboardInput _input;
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.TryGetComponent(out Player player))
{
_input.ActionButtonPressed += StartDialogue;
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.TryGetComponent(out Player player))
{
_input.ActionButtonPressed -= StartDialogue;
EndDialogue();
}
}
private void StartDialogue()
{
Debug.Log("DialogueStarted");
}
private void EndDialogue()
{
Debug.Log("DialogueEnded");
}
}
Отдельно все остальное. На входе подписываемся, на выходе отписываемся. Все. Не нужен никакой OnTriggerStay и WakeUp.