| 
				
				Поворот объекта по клику на 90 градусов.
				 | 
 | 
| absolute_null | Дата: Понедельник, 11 Июня 2018, 20:34 | Сообщение # 1 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | Вид 2d (поворот по часовой или против по координате Z). Нужно реализовать такой алгоритм. При нажатии на клавишу, объект плавно поворачивается на 90 градусов и останавливается. Затем, если опять нажать на клавишу, он повернётся ещё на 90 градусов и остановится. И так сколько угодно. Вот написал код:
 
 Код using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;
  public class PlayerController : MonoBehaviour {
      private int x;     private bool click;
      private int currentPosition;     private bool canInteract;     private BoxCollider2D collisionPlayer;
      private void Start()     {         x = 0;         click = false;         canInteract = false;         collisionPlayer = GetComponent<BoxCollider2D>();     }
      private void OnMouseDown()     {         if (collisionPlayer.enabled)         {             click = true;             currentPosition = (int)transform.localEulerAngles.z;         }              }
      private void Update()     {         if (click)         {               x = 10;             transform.Rotate(transform.forward, x);             int y = (int)transform.localEulerAngles.z - currentPosition;             collisionPlayer.enabled = false;             if (y == 90 || y == -270)             {                 click = false;                 collisionPlayer.enabled = true;             }         }     }
  }
  
  То есть, я кликаю, проверка в update срабатывает, и на каждый кадр объект поворачивается на 10 градусов (значение можно менять), пока разница между текущим и начальным положением поворота не будет 90 градусов (чтобы останавливать объект, когда пройдёт 90 градусов). Плюс под конец ещё проверка на -270, это потому что когда объект пройдёт полный круг, 0 - предыдущие 270 будет -270. Всё работает. Но на компе. Скомпилил на телефон, и либо объект проскакивает за 90, и поворачивается на 100 и больше градусов, либо начинает крутиться (потому что проверка не проходит, хотя фиг знает почему). Уже неделю не могу решить простую задачу: поворачивать плавно объект на 90 градусов на каждый клик.
 
 Сообщение отредактировал absolute_null - Понедельник, 11 Июня 2018, 20:35  |  
| 
 | 
 |    | 
| drcrack | Дата: Понедельник, 11 Июня 2018, 20:56 | Сообщение # 2 |  
| 
 старожил 
Сейчас нет на сайте 
 
 | Код   IEnumerator Rotate() {
    var duration = 0.5f;   var startTime = Time.time;   var startRotation = transform.localRotation;   // чтобы не ломать голову об кватернионы просто берем то что получается твоим методом   transform.Rotate(transform.forward, 90);   var endRotation = transform.localRotation;
    while (true) {
     var k = (Time.time - startTime) / duration;
     if (k >= 1) break;
     transform.localRotation = Quaternion.Slerp(startRotation, endRotation, k);
     yield return null;
    }
    transform.localRotation = endRotation;
  } //  StartCoroutine(Rotate());
   не тестил
 
 Сообщение отредактировал drcrack - Понедельник, 11 Июня 2018, 20:57  |  
| 
 | 
 |    | 
| absolute_null | Дата: Понедельник, 11 Июня 2018, 21:45 | Сообщение # 3 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | drcrack, этот код работает и там и там, спасибо. Но странно, что мой код работает только на пк, а на телефоне баги. Дело в функции Update? На пк и телефоне разное время тика движка? Но он же всё равно должен проходить проверку...
 |  
| 
 | 
 |    | 
| drcrack | Дата: Понедельник, 11 Июня 2018, 22:11 | Сообщение # 4 |  
| 
 старожил 
Сейчас нет на сайте 
 
 | ну ты сравниваешь float с помощью ==, это на пк-то во многих ситуациях не работает, чего уж говорить о телефонах вторая проблема твоего кода это зависимость от фпс, чем круче телефон, тем резже будет движение, это косяк
 |  
| 
 | 
 |    | 
| absolute_null | Дата: Понедельник, 11 Июня 2018, 22:25 | Сообщение # 5 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | drcrack, ну с флоатом я схитрил и привёл вообще всё к инту, а вот про зависимость от фпс я думал, скорее всего из-за этого
 |  
| 
 | 
 |    | 
| drcrack | Дата: Понедельник, 11 Июня 2018, 22:42 | Сообщение # 6 |  
| 
 старожил 
Сейчас нет на сайте 
 
 | Цитата  drcrack, ну с флоатом я схитрил и привёл вообще всё к инту  вот тока каст флоата в инт отбрасывает дробную часть, а не округляет, и если из-за неточности флоатов после поворота получилось 89.9999999981f то после каста будет 89 ты лучше не хитри а делай как положено))
 
 Цитата  а вот про зависимость от фпс я думал, скорее всего из-за этого  точно не из-за этого, это скорее просто мелкий UX косяк
 
 Сообщение отредактировал drcrack - Понедельник, 11 Июня 2018, 22:43  |  
| 
 | 
 |    | 
| absolute_null | Дата: Понедельник, 11 Июня 2018, 23:39 | Сообщение # 7 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | drcrack, Цитата  если из-за неточности флоатов после поворота получилось 89.9999999981f то после каста будет 89   блин, вот, точно, теперь я понял. Вот оно и вылезло, поэтому на телефоне он просто не проходил проверку.
 |  
| 
 | 
 |    |