Некорректное срабатывание

Программирование на Юнити.

Некорректное срабатывание

Сообщение labinzevvAlex 27 фев 2021, 13:45

Всем привет. Такая проблема:
Делаю переключатель на основе If и bool в OnTriggerStay (код ниже) дело в том, что иногда он срабатывает как надо, то есть по очереди выполняет if и else, а иногда может по три раза выполнить if, потом один раз else и наоборот, в общем сбивается. Может кто нибудь сталкивался и знает как решить эту проблему?
Синтаксис:
Используется csharp
public bool handUp = false;

 void OnTriggerStay(Collider other)
    {
        if (other.tag == "hand")
        {
            handUp = !handUp;  

            if (Input.GetKeyDown(KeyCode.G))  
            {
                if (handUp == true)                        
                {
                    obj_Rigidbody.freezeRotation = true;
                    obj_Rigidbody.constraints = RigidbodyConstraints.FreezePosition;

                    transform.rotation = new Quaternion(hand.transform.rotation.x, hand.transform.rotation.y,
                    hand.transform.rotation.z, hand.transform.rotation.w);

                    transform.position = new Vector3(hand.transform.position.x, -2.2f, hand.transform.position.z);
                                                                                                                                             
                    transform.parent = GameObject.Find("hand").transform;

                    Debug.Log("1");
                }
                else
                {
                    obj_Rigidbody.constraints = RigidbodyConstraints.None;  

                    transform.parent = null;

                    Debug.Log("2");

                }
            }
        }
    }

 
labinzevvAlex
UNIт
 
Сообщения: 74
Зарегистрирован: 12 июл 2020, 12:18

Re: Некорректное срабатывание

Сообщение Alkos26Rus 27 фев 2021, 14:15

Используй OnTriggerEnter
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Некорректное срабатывание

Сообщение labinzevvAlex 27 фев 2021, 14:27

Alkos26Rus писал(а):Используй OnTriggerEnter

В моём случае только OnTriggerStay. С OnTriggerEnter вообще перестаёт работать..
labinzevvAlex
UNIт
 
Сообщения: 74
Зарегистрирован: 12 июл 2020, 12:18

Re: Некорректное срабатывание

Сообщение Alkos26Rus 27 фев 2021, 14:31

тогда опусти переключение(handUp = !handUp;) в событие нажатия, а то он у тебя каждый кадр переключает
Синтаксис:
Используется csharp


            if (Input.GetKeyDown(KeyCode.G))  
            {
             handUp = !handUp;  
 
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Некорректное срабатывание

Сообщение labinzevvAlex 27 фев 2021, 14:51

Alkos26Rus писал(а):тогда опусти переключение(handUp = !handUp;) в событие нажатия, а то он у тебя каждый кадр переключает
Синтаксис:
Используется csharp


            if (Input.GetKeyDown(KeyCode.G))  
            {
             handUp = !handUp;  
 


Спасибо, действительно помогло, но не совсем. Стал реже сбиваться, но всё равно иногда повторяет действие.
labinzevvAlex
UNIт
 
Сообщения: 74
Зарегистрирован: 12 июл 2020, 12:18

Re: Некорректное срабатывание

Сообщение Alkos26Rus 27 фев 2021, 15:05

Не должен. if (Input.GetKeyDown(KeyCode.G)) срабатывает один раз, и переключение должно быть один раз. Хочешь сказать что логи срабатывают больше чем один раз при инажатии кнопки?
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Некорректное срабатывание

Сообщение labinzevvAlex 27 фев 2021, 15:11

Alkos26Rus писал(а):Не должен. if (Input.GetKeyDown(KeyCode.G)) срабатывает один раз, и переключение должно быть один раз. Хочешь сказать что логи срабатывают больше чем один раз при инажатии кнопки?


Да, в этом то вся проблема как раз... Самое главное, что если Перенести весь код в Update без if (other.tag == "test") то всё работает нормально, без сбоев. Уже тестил на чистых объектах, только void OnTriggerStay с Debug.Log("1"); всё равно за одно нажатие выдаёт несколько Debug.Log("1"); и периодически повторяет выполнение одного и того же по нескольку раз. Опять же в Update всё норм. Получается дело в самом void OnTriggerStay???
labinzevvAlex
UNIт
 
Сообщения: 74
Зарегистрирован: 12 июл 2020, 12:18

Re: Некорректное срабатывание

Сообщение Dewa1s 28 фев 2021, 19:14

OnTriggerStay выполняется при обновлении физики, GetKeyDown проверяется в кадр когда нажато. Если звезды сойдутся и ты нажмешь кнопку в тот же кадр, когда обновляется физика - оно сработает.
Проверять нажатия в зависящем от физике методе ужасное решение и в большинстве случаев так делать не надо
Аватара пользователя
Dewa1s
Старожил
 
Сообщения: 564
Зарегистрирован: 26 дек 2011, 02:12


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8