| 
				
				Некорректное срабатывание
				 | 
 | 
| 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
 |  
| 
 | 
 |    |