EnGold
@EnGold

Почему OnTriggerStay2D работает не сразу?

Я пытаюсь сделать систему диалогов и мне необходимо проверять находиться ли игрок рядом с нпс и для этого я использовал OnTriggerStay2D, но для того чтбы он вообще сработал мне нужно по нескольку раз нажимать на (в моем случае) пробел. Это из-за того что скрипт с триггером стоит на нпс или я чтото делаю не так?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DialogTrigger : MonoBehaviour
{
    public Dialogue dialogue;
    public GameObject dialogueBox;

    public void TriggerDialogue()
    {
        FindObjectOfType<DialogueManager>().StartDialogue(dialogue);
    }

    private void OnTriggerStay2D(Collider2D collision)
    {
        FindObjectOfType<Rigidbody2D>().WakeUp();
        if (Input.GetKeyDown(KeyCode.Space) && dialogueBox.activeInHierarchy == false)
        {
            TriggerDialogue();
        }
        else if (Input.GetKeyDown(KeyCode.Space))
        {
            FindObjectOfType<DialogueManager>().DisplayNextSentence();
        }
    }
}


так же хотел бы немного пояснить за код. 1.WakeUp я вызываю потому что у меня по другому не работает( надо перезаходить в триггер), 2.с помощью activeInHierarchy я проверяю видно ли диалоговое окно.
  • Вопрос задан
  • 327 просмотров
Решения вопроса 1
K0TlK
@K0TlK
Буллю людей.
Потому что 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.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы