Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 31.10.2018
Сообщений: 19

Плавный поворот на 45 градусов по одиночному нажатию отдельной клавиши

02.06.2019, 19:19. Показов 7213. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, возникла проблема, нужно сделать плавный поворот на 45 градусов по оси Z по одиночному нажатию клавиши в 2D. Знаю, что это не так сложно, rotate и Time.deltaTime, но походу так туплю, что не получается) Подскажите, как можно осуществить данное действие.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.06.2019, 19:19
Ответы с готовыми решениями:

Unity2D. Как сделать плавный поворот GameObject'a на 90/180 градусов по оси Z, нажимая 1 раз на клавишу?
Уточню еще раз, это вопрос касаемо Unity 2D. Требуется, чтобы при нажатии на клавишу(не удерживании!) gameobject плавно(именно плавно,...

Плавный поворот
Здравствуйте, у меня огромная просьба мне нужен скрипт который при нажатии кнопки "пробел" каждый раз выполнял ПЛАВНЫЙ ПОВОРОТ на...

Плавный поворот
Здравствуйте я сделал программу с условием нажатия пробела и коэффициентом i равным изначально 0 а после совершения команды = 1 public...

10
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
02.06.2019, 19:30
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using UnityEngine;
using System.Collections;
 
class test : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            StartCoroutine(c_Rotate());
        }
    }
 
    IEnumerator c_Rotate()
    {
        var tr = transform;
        var e = tr.eulerAngles;
        e.z += 45.0f;
 
        while (true)
        {
            if (Mathf.Abs(tr.eulerAngles.z - e.z) < 0.01f)
            {
                tr.eulerAngles = e;
                break;
            }
            else
            {
                tr.eulerAngles = Vector3.Lerp(tr.eulerAngles, e, 5.0f * Time.deltaTime);
                yield return null;
            }
        }
    }
}
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
04.06.2019, 11:01
Ещё как вариант код ниже поворачивает стрелочками (вправо/влево) объект в разные стороны, целевой поворот всегда будет кратен 45 градусам, вне зависимости, когда нажимают на стрелочки:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using UnityEngine;
 
public class Rotator : MonoBehaviour
{
    public float rotationSpeed = 5f;
    public float angleStep = 45;
 
    private float _targetRotationZ;
    private float _currentRotationZ;
 
    private bool _isRotating;
 
    private void Start()
    {
        _targetRotationZ = 0;
        _currentRotationZ = 0;
    }
 
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.LeftArrow)) { _targetRotationZ += angleStep; _isRotating = true; }
 
        if (Input.GetKeyDown(KeyCode.RightArrow)) { _targetRotationZ -= angleStep; _isRotating = true; }
 
        if (_isRotating)
        {
            
            _currentRotationZ = Mathf.Lerp(_currentRotationZ, _targetRotationZ, rotationSpeed * Time.deltaTime);
 
            if (Mathf.Abs(_currentRotationZ - _targetRotationZ) < 0.1f)
            {
                _currentRotationZ = _targetRotationZ;
                _isRotating = false;
            }
 
            transform.eulerAngles = Vector3.forward * _currentRotationZ;
        }
 
    }
}
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
04.06.2019, 13:15
1max1, samana,
У вас постоянно накапливается погрешность.
Через некоторое время углы перестанут быть кратными 45.
1
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
04.06.2019, 13:36
Storm23, Я не могу найти причину погрешности в моём коде, подскажите пожалуйста где я ошибаюсь?
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
04.06.2019, 13:39
Storm23, мне тоже подскажите)
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
04.06.2019, 14:13
1max1, А ваш код у меня совсем плохо работает, объект дёргается через пару кликов.
Но ТС не уточнил задачу, ему нужно чтобы объект поворачивался на 45 градусов от текущего поворота, или чтобы объект всегда был повёрнут кратно 45-пяти градусам..
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
04.06.2019, 14:39
Цитата Сообщение от samana Посмотреть сообщение
Я не могу найти причину погрешности в моём коде
У вас 45 всегда прибавляется к текущему значению _targetRotationZ. Но целые числа в float, как правило идут с погрешностью. И 45 это ровно 45, а например 45,001. И если постоянно прибавлять это число, то погрешность накапливается, и числа перестают быть кратными 45 даже приблизительно.

В общем, нельзя так делать. Если нам нужно, что бы угол был всегда кратным 45, то нужно завести переменную типа int, и использовать ее для вычисления угла: angle = i * 45. По клавишам менять i. Целые числа не имеют погрешности и повороты будут всегда кратны 45.

Цитата Сообщение от samana Посмотреть сообщение
Но ТС не уточнил задачу, ему нужно чтобы объект поворачивался на 45 градусов от текущего поворота, или чтобы объект всегда был повёрнут кратно 45-пяти градусам..
Ну обычно в 2d играх необходимы повороты кратные 90 или 45. Может быть у автора это и не так, не знаю.
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
04.06.2019, 14:48
Цитата Сообщение от Storm23 Посмотреть сообщение
Но целые числа в float, как правило идут с погрешностью. И 45 это ровно 45, а например 45,001.
Да, согласен. Тоже было такое опасение из-за float, но при тесте крутил долго туда-сюда и значения _targetRotationZ оставались целыми в инспекторе, подумал что - всё в порядке. Но в целом да, вы правы, лучше не полагаться, а делать чётко.

KrusX, если что, измените тип перменной _targetRotationZ на int.
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
04.06.2019, 16:44
Цитата Сообщение от samana Посмотреть сообщение
А ваш код у меня совсем плохо работает, объект дёргается через пару кликов.
Ну так надо дождаться окончания корутины, а не тыкать без конца без края)
0
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
04.06.2019, 16:48
Цитата Сообщение от 1max1 Посмотреть сообщение
Ну так надо дождаться окончания корутины, а не тыкать без конца без края)
1max1, Простите, просто забыл прочитать документацию к методу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.06.2019, 16:48
Помогаю со студенческими работами здесь

Плавный поворот
Такая проблем есть танк и есть управление, но когда я стараюсь повернуть в сторону то он едет боком а мне надо чтоб он разворачивался вот...

Плавный поворот
Доброго времени суток! Я хочу сделать плавный поворот так вправо так и влево. К сожалению мне удалось сделать простой поворот (и только...

Реализовать плавный поворот машины
Мне нужно сделать чтобы машина (нарисованная) поворачивала не резко, а плавно я не понимаю как это сделать. Помогите пожалуйста !

Как сделать плавный поворот башни
Всем привет! Вообщем, я хотел создать плавный поворот башни танка за мышью, написал немного кода Угол в радианах var A =...

Плавный поворот объекта и только потом перемещение
Доброго времени суток. Есть объект и координаты на карте в которые этот объект должен перемещаться. Как сделать так чтобы объект начал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru