Работа с OnTriggerStay

В общем, не корректно работает триггер (возможно я чего-то не знаю), при использовании такого кода :

 void OnTriggerStay(Collider other)
{
   
        if (Input.GetKeyDown(lootButton))
        {
            Debug.Log("buttonWasPushed");
        }
}

когда я нахожусь в коллайдере объекта и нажимаю на кнопку - лог дублируется (2 раза выводится одно и то же сообщение) , плюс ко всему, не все нажатия вообще воспринимаются, то есть я могу нажать 5 раз, и из пяти нажатий сообщение может вообще не выйти. (С кнопкой все ок, проверял на других)


Ответы (3 шт):

Автор решения: Yaroslav

Возможно чего-то в первом-же обзаце документации:

OnTriggerStay is called almost all the frames for every Collider other that is touching the trigger. The function is on the physics timer so it won't necessarily run every frame.

И хоть не в первом абзаце, но про то, как обнавляется Input тоже написано:

Note also that the Input flags are not reset until Update. It is suggested you make all the Input calls in the Update Loop.

У них частоты разные и OnTriggerStay мягко говоря не место для Input.

→ Ссылка
Автор решения: Константин Dml

Нашел альтернативу, кому интересно :

    void Update()
    {
        if (Input.GetKeyDown(lootButton) && inTrigger == true)
        {
            wasPushed = true;
        }
    }
    

   
    void OnTriggerStay(Collider other)
    {
        inTrigger = true   // Можно и OnTriggerEnter поставить, думаю сильно роли не играет.
        if (wasPushed == true)
        {
            Loot();
            wasPushed = false;

        }
    }
     void OnTriggerExit(Collider other)
     {
        inTrigger = false;
     }

Получается, что в апдейте при нажатии на кнопку - меняется bool на true и в триггере (когда персонаж в нем) идет проверка, является ли bool true, если да - обрабатывается мой метод Loot(), и переменная bool становится false. Как-то так, я думаю решения еще есть, но это первое, что пришло в голову.

→ Ссылка
Автор решения: Yaroslav

Мог бы сразу поставить вопрос таким образом.

public class Loot : MonoBehaviour {

    public void Taking () {
        DestroyImmediate(gameObject);
    }
}

public class Player : MonoBehaviour {
    private List<Loot> _closeLoot = new List<Loot>();

    private void Update () {
        if (Input.GetKeyDown(KeyCode.Space) && _closeLoot.Count > 0) {
            _closeLoot[0].Taking();
            _closeLoot.RemoveAt(0);
        }
    }

    private void OnTriggerEnter (Collider other) {
        if (other.GetComponent<Loot>() != null)
            _closeLoot.Add(other.GetComponent<Loot>());
    }

    private void OnTriggerExit (Collider other) {
        if (other.GetComponent<Loot>() != null)
            _closeLoot.Remove(other.GetComponent<Loot>());
    }
}
→ Ссылка