Суббота, 20 Апреля 2024, 03:20

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Некорректное срабатывание
Некорректное срабатывание
labinzevvДата: Суббота, 27 Февраля 2021, 13:45 | Сообщение # 1
частый гость
Сейчас нет на сайте
Всем привет. Такая проблема:
Делаю переключатель на основе If и bool в OnTriggerStay (код ниже) дело в том, что иногда он срабатывает как надо, то есть по очереди выполняет if и else, а иногда может по три раза выполнить if, потом один раз else и наоборот, в общем сбивается. Может кто нибудь сталкивался и знает как решить эту проблему?

Код

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");

                }
            }
        }
    }


3d modeling, unfolding, and texturing. My works: https://vk.com/labinzevv

Сообщение отредактировал labinzevv - Суббота, 27 Февраля 2021, 13:48
IlyaKosДата: Суббота, 27 Февраля 2021, 14:42 | Сообщение # 2
участник
Сейчас нет на сайте
Так, пока ты в триггере, у тебя переменная постоянно моргает с тру на фолс туда-сюда, поэтому такой результат.
labinzevvДата: Суббота, 27 Февраля 2021, 14:55 | Сообщение # 3
частый гость
Сейчас нет на сайте
Цитата IlyaKos ()
Так, пока ты в триггере, у тебя переменная постоянно моргает с тру на фолс туда-сюда, поэтому такой результат.


Да, уже перенёс handUp = !handUp; в if (Input.GetKeyDown(KeyCode.G)) Всё равно продолжает сбиваться...


3d modeling, unfolding, and texturing. My works: https://vk.com/labinzevv
drcrackДата: Суббота, 27 Февраля 2021, 15:00 | Сообщение # 4
старожил
Сейчас нет на сайте
Цитата
transform.rotation = new Quaternion(hand.transform.rotation.x, hand.transform.rotation.y, hand.transform.rotation.z, hand.transform.rotation.w);

не по теме, но как вообще пришло в голову написать это таким образом, вместо transform.rotation = hand.rotation?
labinzevvДата: Суббота, 27 Февраля 2021, 15:09 | Сообщение # 5
частый гость
Сейчас нет на сайте
Цитата drcrack ()
не по теме, но как вообще пришло в голову написать это таким образом, вместо transform.rotation = hand.rotation?


Ну присвоение координат вращения того объекта к которому будет Child объект, на котором висит скрипт.
Если не правильно, подскажи, как сделать корректно. Просто оно в данном виде работает)


3d modeling, unfolding, and texturing. My works: https://vk.com/labinzevv
drcrackДата: Суббота, 27 Февраля 2021, 16:57 | Сообщение # 6
старожил
Сейчас нет на сайте
Я ж написал как правильно (и в 2-3 раза быстрее)
labinzevvДата: Суббота, 27 Февраля 2021, 17:28 | Сообщение # 7
частый гость
Сейчас нет на сайте
Цитата drcrack ()
Я ж написал как правильно (и в 2-3 раза быстрее)

Всё теперь догнал) Спасибо за подсказку, одной проблемой меньше.


3d modeling, unfolding, and texturing. My works: https://vk.com/labinzevv
IlyaKosДата: Воскресенье, 28 Февраля 2021, 03:06 | Сообщение # 8
участник
Сейчас нет на сайте
Попробуй вынести условия в апдейт, и обновляй, когда находишься в триггере.

Код
void Update ()
{
UpdateHandUp ();
}

void UpdateHandUp ()
{
if (!inTrigger) return;

*код*

}

void OnTriggerStay
}
if (tag == "hand") inTrigger = true;
}

void OnTriggerExit ()
{
if (tag == "hand") inTrigger = false;
}
drcrackДата: Воскресенье, 28 Февраля 2021, 10:31 | Сообщение # 9
старожил
Сейчас нет на сайте
^ да, забыл написал, вот это правильный подход, потому что OnTriggerStay выполняется в цикле физики (FixedUpdate) и проверять GetKeyDown в нем не стоит т.к. все начинает зависеть от фпс
labinzevvДата: Воскресенье, 28 Февраля 2021, 16:48 | Сообщение # 10
частый гость
Сейчас нет на сайте
Всем спасибо. Решил проблему так: В Update меняю тег объекта (с помощью переключателя bool и if)
А уже в OnTriggerStay код выполняется при смене тега. Как то так..


3d modeling, unfolding, and texturing. My works: https://vk.com/labinzevv
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Некорректное срабатывание
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг