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

LookAt в 2D

СообщениеДобавлено: 20 окт 2017, 12:02
Rulz009
Привет всем.
Такой вопрос - в 3D всё работает нормально (transform.LookAt(target);), но как это реализовать в 2D? То есть, чтобы объект (спрайт) поворачивался вслед за изменением позиции таргета (тоже спрайта). Возможно, вообще это делается не через lookat?

Re: LookAt в 2D

СообщениеДобавлено: 20 окт 2017, 14:48
1max1
Синтаксис:
Используется csharp
static class Extensions
{
        #region LookAt2D
        public static void LookAt2D(this Transform me, Vector3 target, Vector3? eye = null)
        {
            float signedAngle = Vector2.SignedAngle(eye ?? me.up, target - me.position);

            if (Mathf.Abs(signedAngle) >= 1e-3f)
            {
                var angles = me.eulerAngles;
                angles.z += signedAngle;
                me.eulerAngles = angles;
            }
        }
        public static void LookAt2D(this Transform me, Transform target, Vector3? eye = null)
        {
            me.LookAt2D(target.position, eye);
        }
        public static void LookAt2D(this Transform me, GameObject target, Vector3? eye = null)
        {
            me.LookAt2D(target.transform.position, eye);
        }
        #endregion
}
 


Расширение для трансформа, где eye это глобальное направление которое будет повернуто сторону нужных координат, к примеру использовать так:
Синтаксис:
Используется csharp
transform.LookAt2D(Vector2.zero);

В результате получим что вектор up спрайта будет направлен в (0,0) координату.

Re: LookAt в 2D

СообщениеДобавлено: 20 окт 2017, 15:23
Valentinus

Re: LookAt в 2D

СообщениеДобавлено: 20 окт 2017, 18:23
Rulz009
Valentinus писал(а):https://yandex.ru/yandsearch?&clid=2186620&text=unity%20LookAt%20%D0%B2%202D&lr=49

Google лучше.

Re: LookAt в 2D

СообщениеДобавлено: 20 окт 2017, 18:24
Rulz009
1max1 писал(а):
Синтаксис:
Используется csharp
static class Extension
{
    #region LookAt2D
    public static void LookAt2D(this Transform me, Vector2 eye, Vector2 target)
    {
        Vector2 look = target - (Vector2)me.position;

        float angle = Vector2.Angle(eye, look);

        Vector2 right = Vector3.Cross(Vector3.forward, look);

        int dir = 1;

        if (Vector2.Angle(right, eye) < 90)
        {
            dir = -1;
        }

        me.rotation *= Quaternion.AngleAxis(angle * dir, Vector3.forward);
    }

    public static void LookAt2D(this Transform me, Vector2 eye, Transform target)
    {
        me.LookAt2D(eye, target.position);
    }

    public static void LookAt2D(this Transform me, Vector2 eye, GameObject target)
    {
        me.LookAt2D(eye, target.transform.position);
    }
    #endregion
}
 


Расширение для трансформа, где eye это глобальное направление которое будет повернуто сторону нужных координат, к примеру использовать так:
Синтаксис:
Используется csharp
transform.LookAt2D(transform.up, Vector2.zero);

В результате получим что вектор up спрайта будет направлен в (0,0) координату.


Спасибо, очень помогли