Поворот объекта по клику на 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 блин, вот, точно, теперь я понял. Вот оно и вылезло, поэтому на телефоне он просто не проходил проверку.
|
|
| |