Предотвращение движения оси Y в Unity `transform.forward`

Я создаю 3D-игру в Unity, и у меня есть скрипт, который позволяет игроку осматриваться с помощью мыши. Для перемещения игрока в том направлении, в котором он смотрит, я использую transform.forward. Моя проблема в том, что когда они смотрят в потолок и нажимают «W» (вперед), они начинают подниматься в воздух. В основном мне нужно знать, есть ли метод или подметод transform.forward, который позволяет перемещаться только по осям x и z.

Вот мой скрипт движения (C#):

if (transform.rotation.x < -10)
        {
            //do no forward or backward movement
            Debug.Log("Rotation too great to forward move...");
            tooGoodForMovement = true;

        }
        else
        {
            tooGoodForMovement = false;
            if (Input.GetKey(KeyCode.W))
            {
                //Forward
                player.velocity = (transform.FindChild("Main Camera").transform.forward * moveSpeed);
            }
            if (Input.GetKey(KeyCode.S))
            {
                //Back
                player.velocity = (-transform.FindChild("Main Camera").transform.forward * moveSpeed);
            }
        }
        if (Input.GetKey(KeyCode.A))
        {
            //Left
            player.velocity = -transform.FindChild("Main Camera").transform.right * moveSpeed;
        }

        if (Input.GetKey(KeyCode.D))
        {
            //Right
            player.velocity = transform.FindChild("Main Camera").transform.right * moveSpeed;
        }

person Sub 6 Resources    schedule 04.11.2016    source источник


Ответы (1)


Попробуйте установить вектор скорости во временную переменную и сбросить Y до нуля.

Transform camera;

void Start()
{
    //Cache transform.FindChild so that we don't have to do it every time
    camera = transform.FindChild("Main Camera");
}

Затем в другой вашей функции:

Vector3 velocity = Vector3.zero;

if (transform.rotation.x < -10)
{
    //do no forward or backward movement
    Debug.Log("Rotation too great to forward move...");
    tooGoodForMovement = true;
}
else
{
    tooGoodForMovement = false;
    if (Input.GetKey(KeyCode.W))
    {
        //Forward
        velocity = camera.forward * moveSpeed;
    }
    if (Input.GetKey(KeyCode.S))
    {
        //Back
        velocity = -camera.forward * moveSpeed;
    }
}
if (Input.GetKey(KeyCode.A))
{
    //Left
    velocity = -camera.right * moveSpeed;
}

if (Input.GetKey(KeyCode.D))
{
    //Right
    velocity = camera.right * moveSpeed;
}

velocity.Y = 0;
player.velocity = velocity;
person Abion47    schedule 04.11.2016
comment
Хорошо. Пожалуйста, добавьте исправление для FindChild("Main Camera"), которое делалось каждый раз. Хорошо бы это поймать. - person Programmer; 05.11.2016
comment
Это сработало. Благодарю вас! Я должен был подумать об этом раньше. Также @Programmer, что вы подразумеваете под исправлением FindChild("Main Camera")? - person Sub 6 Resources; 05.11.2016
comment
@Sub6Resources Проверьте обновленный ответ. Постоянное использование FindChild обходится дорого. Кэшируйте преобразование. - person Programmer; 05.11.2016
comment
@Programmer Спасибо за обновленный ответ. Да, я должен был это сделать. Я исправлю это немедленно. - person Sub 6 Resources; 07.11.2016