KeysCG
@KeysCG
3d designer/Art Designer

Почему может не реагировать объект на условие нажатия кнопки?

Доброго времени суток!
Возникла такая проблема, что когда я пытаюсь добавить условие на триггер (нажатие кнопки), то объект просто не реагирует совсем. Без условия нажатия всё работает :(
Помогите пожалуйста понять как правильно это сделать:
private void OnTriggerEnter(Collider other)
    {
            if (other.tag == "Player" && Input.GetKeyDown(KeyCode.F))
            {
                AddItem(items, amount);
                Destroy(gameObject);
            }
    }
  • Вопрос задан
  • 150 просмотров
Пригласить эксперта
Ответы на вопрос 1
K0TlK
@K0TlK
Буллю людей.
OnTriggerEnter вызывается один раз, когда объект входит в триггер. Соответственно, все эти проверки выполняются единожды. Т.е. в одном кадре у объекта, вошедшего в триггер должен быть тэг player и должна быть нажата кнопка F. Первое условие может быть и соблюдено, если тэг правильно написан, но чтобы соблюсти второе, нужно одновременно с входом в триггер нажать кнопку F, что сделать сложно. Умники, конечно, посоветуют использовать OnTriggerStay, но не нужно этого делать. Нужно отделить ввод. Получится что-то типа этого:
private void OnTriggerEnter(Collider other)
{
    if (other.TryGetComponent(out Player player))
    {
        PlayerInput.ActionButtonPressed += DoStuff;
    }
}

private void OnTriggerExit(Collider other)
{
    if (other.TryGetComponent(out Player player))
    {
        PlayerInput.ActionButtonPressed -= DoStuff;
    }
}

private void DoStuff()
{
    //Do stuff
}


В OnTriggerEnter проверяется, присутствует ли компонент Player на объекте. Именно компонент, а не тэг. Не нужно делать проверки по тэгу, т.к. это строки и ты можешь ошибиться в написании этой строки, делай проверки по наличию компонента. Если компонент имеется, то подписываем нужный метод на событие ActionButtonPressed. В OnTriggerExit, соответственно, отписываемся. И в OnDestroy тоже, если объект будет уничтожен. Отписываться нужно всегда.
И грубый пример PlayerInput ниже:
public class PlayerInput : MonoBehaviour
{
    public static event Action ActionButtonPressed;


    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.F))
        {
            ActionButtonPressed?.Invoke();
        }
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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