#unity3d #unity3d_ui
Если задать примерно такой разворот: Quaternion quaternion = Quaternion.Euler(0, 0, 360 * A); не важно что будет на месте A (из целых чисел) разворота никогда не будет, если же счисло будет типа A.5 (число с запятой где после запятой половина) то разворот будет ровно 180, из этого выходит что задать разворот на 3600 (т.е. 10 кругов) простым способом нельзя, у меня выполняеться плавный поворот круга, что бы я не писал всякий бред по типу считания каждого полукруга я задал вопрос: как сделать разворот на большое кол-во градусов (т.е. более одного целого круга): мой код поворота: Quaternion quaternion = Quaternion.Euler(0, 0, 1800); float t = 5f; float tA = Time.time; while (t > 0) { t -= Time.time - tA; tA = Time.time; Debug.Log(t); transform.GetComponent().rotation = Quaternion.Lerp(transform.rotation, quaternion, (5-t)/5f); yield return 0; } кстати, тут еще я хотел поворот ровно за 5 секунд, но почему-то (в силу моей незнанности оно работает не верно). Главный вопрос: как сделать разворот (в моем случае плавный) на несколько кругов, по типу на 3600 градусов т.е. 10 кругов. Второй же вопрос, как сделать разворот ровно за конкретное кол-во времени
Ответы
Ответ 1
Вся проблема заключается в том, что вращение вокруг любой оси физически ограничено и находится в промежутке [0;360), если речь идет о градусах. Но не надо путать: мы можем повернуть объект хоть на миллиард градусов - в конце концов он все равно будет иметь поворот в промежутке [0;360). Да и проверить это на практике довольно просто, сделаем так: Debug.Log(Quaternion.Euler(0, 0, 1800).eulerAngles); Debug.Log(Quaternion.Euler(0, 0, 1799).eulerAngles); Смотрим на вывод: Исходя из написанного выше, использовать "референсное" значение для поворота таким образом не получится. Подобное можно реализовать через фиксированный поворот: public class Rotator : MonoBehaviour { public Vector3 rotationStep = new Vector3(0, 0, 0); public float time = 0; IEnumerator RotateForSeconds(float seconds, Vector3 step) { while(seconds > 0) { seconds -= Time.deltaTime; transform.Rotate(step * Time.deltaTime); yield return null; } } void Start() { StartCoroutine(RotateForSeconds(time, rotationStep)); } } А дальше простейшие расчеты: Нужно повернуть объект на 360 градусов за 10 секунд? Значит, нам нужна скорость в 360/10 = 36 градусов в секунду: Нужно повернуть объект на 1800 градусов за 5 секунд? Повторяем действия выше: 1800/5 = 360: А вообще для всего, что связано с ручной анимацией, лучше использовать LeanTween или любой другой tween engine. Но проблема в том, что такие движки работают с "референсными" значениями, что нам не особо подходит из рассуждений выше, но как дополнительную информацию все же оставлю. Залезаем в документацию: LTDescr rotate(GameObject gameObject, Vector3 to, float time) Defined in LeanTween.cs:1481 Rotate a GameObject, to values are in passed in degrees
Комментариев нет:
Отправить комментарий