Работа с OnTriggerStay
В общем, не корректно работает триггер (возможно я чего-то не знаю), при использовании такого кода :
void OnTriggerStay(Collider other)
{
if (Input.GetKeyDown(lootButton))
{
Debug.Log("buttonWasPushed");
}
}
когда я нахожусь в коллайдере объекта и нажимаю на кнопку - лог дублируется (2 раза выводится одно и то же сообщение) , плюс ко всему, не все нажатия вообще воспринимаются, то есть я могу нажать 5 раз, и из пяти нажатий сообщение может вообще не выйти. (С кнопкой все ок, проверял на других)
Ответы (3 шт):
Возможно чего-то в первом-же обзаце документации:
И хоть не в первом абзаце, но про то, как обнавляется Input тоже написано:
У них частоты разные и OnTriggerStay мягко говоря не место для Input.
Нашел альтернативу, кому интересно :
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. Как-то так, я думаю решения еще есть, но это первое, что пришло в голову.
Мог бы сразу поставить вопрос таким образом.
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>());
}
}