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

Проблема с поворотом спрайта.

СообщениеДобавлено: 10 ноя 2018, 06:06
zulec
Доброй ночи, когда я пытаюсь повернуть объект на 180 градусов по z, то он поворачивается.
При повторной попытке поворота объекта, он не переворачивается (хотя по сути он должен принять значение 360 градусов по z, но остаются всё те же 180 градусов...) , не могу понять в чём проблема.
Код:
Синтаксис:
Используется csharp
spr.transform.localRotation = Quaternion.Slerp(spr.transform.localRotation, Quaternion.Euler(spr.transform.localRotation.x, spr.transform.localRotation.y, spr.transform.localRotation.z + 180f), speedRotation);
speedRotation += Time.deltaTime;
 


Код вызывается в FixedUpdate, когда персонаж находится в воздухе.
speedRotation при инициализации равен 0.

Re: Проблема с поворотом спрайта.

СообщениеДобавлено: 10 ноя 2018, 06:51
DimaJoke
Перед тем, в чём ты это измеряешь
Надо ставить new
Синтаксис:
Используется csharp
obj.transform.rotation = new Quatqrnion()
дяя я не знаю, как пишется кватренион)))
Ну или так же с Vector3
Синтаксис:
Используется csharp
transform.position = new Vector3()

Re: Проблема с поворотом спрайта.

СообщениеДобавлено: 10 ноя 2018, 07:27
zulec
Смысл ставить "new"? Если я потом не смогу использовать метод Slerp.

Re: Проблема с поворотом спрайта.

СообщениеДобавлено: 10 ноя 2018, 09:28
1max1
Первое что смущает - это speedRotation += Time.deltaTime;
Что по твоему это оно должно делать?
И еще, в каждом кадре, твое конечное значение будет зависеть от предыдущего:
Синтаксис:
Используется csharp
Quaternion.Euler(spr.transform.localRotation.x, spr.transform.localRotation.y, spr.transform.localRotation.z + 180f)

Странно, что у тебе оно вообще работает как ты хочешь)
Синтаксис:
Используется csharp
class XXX : MonoBehaviour
{
    const float speedRotation = 5.0f;

    Coroutine coroutine;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (coroutine != null)
            {
                StopCoroutine(coroutine);
            }

            coroutine = StartCoroutine(c_Rotate());
        }
    }

    IEnumerator c_Rotate()
    {
        Quaternion r180 = transform.rotation * Quaternion.AngleAxis(180.0f, transform.forward);

        while (true)
        {
            transform.rotation = Quaternion.Lerp(transform.rotation, r180, speedRotation * Time.deltaTime);

            if (transform.rotation.Equals(r180))
            {
                yield break;
            }
            else
                yield return null;
        }
    }
}

Re: Проблема с поворотом спрайта.

СообщениеДобавлено: 10 ноя 2018, 10:27
zulec
Спасибо большое!
Но теперь появилась другая проблема, просчёт идёт с маленькой оплошностью, как нибудь ее можно устранить? А если зажать кнопку прыжка, то оплошность с каждым последующим прыжком становится всё больше и больше.

Re: Проблема с поворотом спрайта.

СообщениеДобавлено: 10 ноя 2018, 10:40
1max1
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

class XXX : MonoBehaviour
{
    const float speedRotation = 5.0f;

    Coroutine coroutine;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (coroutine == null)
            {
                coroutine = StartCoroutine(c_Rotate());
            }    
        }
    }

    IEnumerator c_Rotate()
    {
        Quaternion r180 = transform.rotation * Quaternion.AngleAxis(180.0f, transform.forward);

        while (true)
        {
            transform.rotation = Quaternion.Lerp(transform.rotation, r180, speedRotation * Time.deltaTime);

            if (Quaternion.Angle(transform.rotation, r180) < 1.0f)
            {
                transform.rotation = r180;

                coroutine = null;

                yield break;
            }
            else
                yield return null;
        }
    }
}

Re: Проблема с поворотом спрайта.

СообщениеДобавлено: 10 ноя 2018, 23:11
zulec
Спасибо! Теперь всё работает отлично!