Страница 1 из 1

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

СообщениеДобавлено: 27 фев 2021, 13:45
labinzevvAlex
Всем привет. Такая проблема:
Делаю переключатель на основе 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");

                }
            }
        }
    }

 

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

СообщениеДобавлено: 27 фев 2021, 14:15
Alkos26Rus
Используй OnTriggerEnter

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

СообщениеДобавлено: 27 фев 2021, 14:27
labinzevvAlex
Alkos26Rus писал(а):Используй OnTriggerEnter

В моём случае только OnTriggerStay. С OnTriggerEnter вообще перестаёт работать..

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

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


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

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

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


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


Спасибо, действительно помогло, но не совсем. Стал реже сбиваться, но всё равно иногда повторяет действие.

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

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

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

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


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

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

СообщениеДобавлено: 28 фев 2021, 19:14
Dewa1s
OnTriggerStay выполняется при обновлении физики, GetKeyDown проверяется в кадр когда нажато. Если звезды сойдутся и ты нажмешь кнопку в тот же кадр, когда обновляется физика - оно сработает.
Проверять нажатия в зависящем от физике методе ужасное решение и в большинстве случаев так делать не надо