2D Поворот персонажа в сторону движения

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

2D Поворот персонажа в сторону движения

Сообщение BFZ 21 июл 2017, 06:20

Решил сделать 2D top down сетевую игру чтобы подучится. В игре управление и камера фиксированные, то есть w - всегда вверх, d - всегда вправо и т.д.
Столкнулся с такой проблемой - не понимаю как повернуть персонаж(2D спрайт) лицом в сторону его движения(WSAD через Input.GetAxis).
В 2D вращение идет только по оси Z, соответственно в Rigidbody2D.MoveRotation тоже вращение только на угол, а не кватернион как в 3D, вот и не вдупляю как соотнести получаемый direction Vector2 c клавиатуры к этой одной оси. :(
BFZ
UNITрон
 
Сообщения: 252
Зарегистрирован: 28 июн 2017, 02:16

Re: 2D Поворот персонажа в сторону движения

Сообщение samana 21 июл 2017, 10:05

Вот здесь очень похожая тема http://answers.unity3d.com/questions/65 ... ingle.html
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: 2D Поворот персонажа в сторону движения

Сообщение ru66ssb 21 июл 2017, 10:32

я так решил вот это. здесь есть пустой объект HERO на который цепляется скрипт, для HERO дочерний является HEROBODY (в нем находиться спрайт игрока).

Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class moveHero : MonoBehaviour {

    Rigidbody2D hero;
    public float speedX;
    public float speedY;
    public float horSpeed;
    public GameObject heroBody;
    bool right = true;
    bool up = true;

        // Use this for initialization
        void Start () {
        hero = GetComponent<Rigidbody2D>();
       
               
        }
       
        // Update is called once per frame
        void Update () {



        if (Input.GetKey(KeyCode.LeftArrow))
        {
            speedX = -horSpeed;
            if (right == true)
            {
                heroBody.transform.rotation = Quaternion.Euler(0, 0, 90);
                right = false;
            }

           
           
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            speedX = horSpeed;
            if (right == false)
            {
                heroBody.transform.rotation = Quaternion.Euler(0, 0, -90);
                right = true;
            }

        }
        if (Input.GetKey(KeyCode.UpArrow))
        {
            speedY = horSpeed;
            if (up == true)
            {
                heroBody.transform.rotation = Quaternion.Euler(0, 0, 0);
                up = false;
            }
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            speedY = -horSpeed;
            if (up == false)
            {
                heroBody.transform.rotation = Quaternion.Euler(0, 0, -180);
                up = true;
            }
        }

        transform.Translate(speedX, speedY, 0);
        speedX = 0;
        speedY = 0;

    }
}

 
Аватара пользователя
ru66ssb
UNIт
 
Сообщения: 107
Зарегистрирован: 27 июн 2015, 07:01

Re: 2D Поворот персонажа в сторону движения

Сообщение samana 21 июл 2017, 13:35

А, ну это другое дело, вы же за GetAxis спрашивали.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: 2D Поворот персонажа в сторону движения

Сообщение BFZ 21 июл 2017, 16:17

samana писал(а):А, ну это другое дело, вы же за GetAxis спрашивали.

Это же не я написал. :)
В теме которую вы скинули говорится о слежении персонажа за объектом, а про поворот с использованием Rigidbody2D.MoveRotation с GetAxis ничего нет.

ru66ssb писал(а):я так решил вот это. здесь есть пустой объект HERO на который цепляется скрипт, для HERO дочерний является HEROBODY (в нем находиться спрайт игрока).

Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class moveHero : MonoBehaviour {

    Rigidbody2D hero;
    public float speedX;
    public float speedY;
    public float horSpeed;
    public GameObject heroBody;
    bool right = true;
    bool up = true;

        // Use this for initialization
        void Start () {
        hero = GetComponent<Rigidbody2D>();
       
               
        }
       
        // Update is called once per frame
        void Update () {



        if (Input.GetKey(KeyCode.LeftArrow))
        {
            speedX = -horSpeed;
            if (right == true)
            {
                heroBody.transform.rotation = Quaternion.Euler(0, 0, 90);
                right = false;
            }

           
           
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            speedX = horSpeed;
            if (right == false)
            {
                heroBody.transform.rotation = Quaternion.Euler(0, 0, -90);
                right = true;
            }

        }
        if (Input.GetKey(KeyCode.UpArrow))
        {
            speedY = horSpeed;
            if (up == true)
            {
                heroBody.transform.rotation = Quaternion.Euler(0, 0, 0);
                up = false;
            }
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            speedY = -horSpeed;
            if (up == false)
            {
                heroBody.transform.rotation = Quaternion.Euler(0, 0, -180);
                up = true;
            }
        }

        transform.Translate(speedX, speedY, 0);
        speedX = 0;
        speedY = 0;

    }
}

 


Спасибо, но не подходит.
BFZ
UNITрон
 
Сообщения: 252
Зарегистрирован: 28 июн 2017, 02:16

Re: 2D Поворот персонажа в сторону движения

Сообщение Anonymyx 21 июл 2017, 16:57

Не знаю что у вас с кодом, но вы же можете обратиться именно к одной оси полученного вектора.
someVector.z
Раз проблема в этом.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: 2D Поворот персонажа в сторону движения

Сообщение BFZ 21 июл 2017, 17:42

Anonymyx писал(а):Не знаю что у вас с кодом, но вы же можете обратиться именно к одной оси полученного вектора.
someVector.z
Раз проблема в этом.

UPD

Нашел на форуме то, что заработало так как нужно, всем спасибо! :ymhug:
Синтаксис:
Используется csharp
float SRes = Vector2.Dot(myTransform.right, direction);
rb.MoveRotation(rb.rotation - SRes);
BFZ
UNITрон
 
Сообщения: 252
Зарегистрирован: 28 июн 2017, 02:16


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23