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

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

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

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

СообщениеДобавлено: 21 июл 2017, 10:05
samana
Вот здесь очень похожая тема http://answers.unity3d.com/questions/65 ... ingle.html

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

СообщениеДобавлено: 21 июл 2017, 10:32
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;

    }
}

 

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

СообщениеДобавлено: 21 июл 2017, 13:35
samana
А, ну это другое дело, вы же за GetAxis спрашивали.

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

СообщениеДобавлено: 21 июл 2017, 16:17
BFZ
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;

    }
}

 


Спасибо, но не подходит.

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

СообщениеДобавлено: 21 июл 2017, 16:57
Anonymyx
Не знаю что у вас с кодом, но вы же можете обратиться именно к одной оси полученного вектора.
someVector.z
Раз проблема в этом.

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

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

UPD

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