Страница 1 из 1

Поворот объекта + 90 градусов

СообщениеДобавлено: 24 окт 2018, 15:02
akter23
Всем привет. Так получилось, что при импорте и настройки спрайтов не уследил за их изначальным поворотом, поэтому они все повернуты вправо, что мешает реализовать правильный поворот объекта.
Суть вопроса: нужно повернуть объект в сторону курсора + 90 градусов.
Сам кодец направления поворота я написал, а вот как теперь прибавить к не еще 90 градусов не знаю.
Синтаксис:
Используется csharp
Vector3 posAngle = curPos - transform.position;
transform.rotation = Quaternion.LookRotation(transform.forward, posAngle);

Re: Поворот объекта + 90 градусов

СообщениеДобавлено: 24 окт 2018, 16:12
1max1
transform.right = target.position - transform.position;

Re: Поворот объекта + 90 градусов

СообщениеДобавлено: 24 окт 2018, 18:06
Woolf
Очевидно, что..

Синтаксис:
Используется csharp
transform.rotation = Quaternion.LookRotation(transform.forward, posAngle);
transform.Rotate (0,90,0);

Re: Поворот объекта + 90 градусов

СообщениеДобавлено: 24 окт 2018, 19:00
Tolking
Может проще один раз переимпортить спрайты?

Re: Поворот объекта + 90 градусов

СообщениеДобавлено: 24 окт 2018, 19:07
akter23
Tolking писал(а):Может проще один раз переимпортить спрайты?

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

1max1 писал(а):transform.right = target.position - transform.position;

Этот вариант не подходит, т.к. у персонажа начиаются приступы эпилепсии

Woolf писал(а):Очевидно, что..

Синтаксис:
Используется csharp
transform.rotation = Quaternion.LookRotation(transform.forward, posAngle);
transform.Rotate (0,90,0);

Ваш вариант тоже не подходит, т.к. персонаж начинает ходить и смотреть строго в одну сторону + эпилепсить.

Значит я плохо объяснил.

Вот спрайт в его первоначальном виде Изображение

Игра 2д. В ней есть скрипт управления персонажем с помощью перемещения джойстика. Джойстик передает свои координаты в скрипт перемещения, тот его принимает
Синтаксис:
Используется csharp
void ReceivePosition(Vector3 poistion)
    {
        curPos = poistion;
    }

И все бы работало правильно, но т.к. спрайт изначально развернут, то происходит примерно такая картина Изображение
Где, красный круг - позиция джойстика.

Re: Поворот объекта + 90 градусов

СообщениеДобавлено: 24 окт 2018, 19:52
1max1
Синтаксис:
Используется csharp
static class Extensions
{
    public static void LookAt2D(this Transform me, Vector3 target, Vector3 eye)
    {
        Vector3 look = target - me.position;

        float sAngle = Vector2.SignedAngle(eye, look);

        if (sAngle != 0.0f)
        {
            var eulerAngles = me.eulerAngles;

            eulerAngles.z += sAngle;

            me.eulerAngles = eulerAngles;
        }
    }
}


Re: Поворот объекта + 90 градусов

СообщениеДобавлено: 24 окт 2018, 20:39
akter23
1max1 писал(а):
Синтаксис:
Используется csharp
static class Extensions
{
    public static void LookAt2D(this Transform me, Vector3 target, Vector3 eye)
    {
        Vector3 look = target - me.position;

        float sAngle = Vector2.SignedAngle(eye, look);

        if (sAngle != 0.0f)
        {
            var eulerAngles = me.eulerAngles;

            eulerAngles.z += sAngle;

            me.eulerAngles = eulerAngles;
        }
    }
}


То что надо! Спасибо большое.
Правда я так и не понял, как работает этот скрипт :/

Вот тут, мы получаем направлеие вектора.
Синтаксис:
Используется csharp
Vector3 look = target - me.position;


Здесь я так понимаю, мы получаем угол между векторами.
Синтаксис:
Используется csharp
float sAngle = Vector2.SignedAngle(eye, look);


А вот эту часть кода не понял совершенно.
Если угол между векторами != 0, то мы объявляем перменную eulerAngles и присваиваем ей значение me.eulerAngles, т.е. метод отвечающий за вращение вектора вокруг своей оси.
Потом мы берем ось Z и прибавляем ей угол между векторами, после чего стало вообще непонятно.
Синтаксис:
Используется csharp
if (sAngle != 0.0f)
        {
            var eulerAngles = me.eulerAngles;

            eulerAngles.z += sAngle;

            me.eulerAngles = eulerAngles;
        }


Каким образом это помогло нормализовать направление поворота, не подскажите?

Re: Поворот объекта + 90 градусов

СообщениеДобавлено: 24 окт 2018, 20:45
1max1
Второй аргумент метода это тот вектор, который должен смотреть в точку (target), в твоём случае это transform.right, это мог бы быть и forward, но так как моделька у тебя повернута на 90 вправо, вектор right - то что нужно.
Если угол между векторами != 0

В целях оптимизации, зачем поворачивать если уже и так все повернуто?))
после чего стало вообще непонятно.

К углу поворота по Z добавляются недостающие градусы вот и всё.