Unity: диагональное движение не соответствует правильному вводу клавиш

Я пытался найти решение этой проблемы некоторое время без везения.

Я хочу иметь возможность двигаться в 8 направлениях, но по какой-то странной причине мой игрок хочет двигаться только в 6 направлениях.

Когда я нажимаю:

  • W+D или W+A, он перемещается в верхний правый угол.

  • S+D или S+A, он перемещается в нижний левый угол.

Вертикальные и горизонтальные движения работают отлично. Это только два из четырех диагональных движений, которые вызывают боль.

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerControllerTest : MonoBehaviour
{

    public float moveSpeed;

    private Animator anim;
    private Rigidbody2D playerRigidbody;

    private bool playerMoving;
    public Vector2 lastMove;

    // Use this for initialization
    void Start()
    {

        anim = GetComponent<Animator>();
        playerRigidbody = GetComponent<Rigidbody2D>();

    }

    // Update is called once per frame
    void Update()
    {

        playerMoving = false;

        if (Input.GetAxisRaw("Horizontal") > 0.5f || Input.GetAxisRaw("Horizontal") < -0.5f)

            {
                playerRigidbody.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * moveSpeed, playerRigidbody.velocity.y);
                playerMoving = true;
                lastMove = new Vector2(Input.GetAxisRaw("Horizontal"), 0f);
            }

        if (Input.GetAxisRaw("Vertical") > 0.5f || Input.GetAxisRaw("Vertical") < -0.5f)

            {
                playerRigidbody.velocity = new Vector2(playerRigidbody.velocity.y, Input.GetAxisRaw("Vertical") * moveSpeed);
                playerMoving = true;
                lastMove = new Vector2(0f, Input.GetAxisRaw("Vertical"));
            }

        if (Input.GetAxisRaw("Horizontal") < 0.5f && Input.GetAxisRaw("Horizontal") > -0.5f)

            {
                playerRigidbody.velocity = new Vector2(0f, playerRigidbody.velocity.y);
            }

        if (Input.GetAxisRaw("Vertical") < 0.5f && Input.GetAxisRaw("Vertical") > -0.5f)

            {
                playerRigidbody.velocity = new Vector2(playerRigidbody.velocity.x, 0f);
            }

        anim.SetFloat("MoveX", Input.GetAxisRaw("Horizontal"));
        anim.SetFloat("MoveY", Input.GetAxisRaw("Vertical"));
        anim.SetBool("PlayerMoving", playerMoving);
        anim.SetFloat("LastMoveX", lastMove.x);
        anim.SetFloat("LastMoveY", lastMove.y);
    }
}

Это основной код, который я использовал для движения моего персонажа. Если бы кто-то мог помочь мне исправить это, это было бы очень признательно.

Спасибо, Редза.


person Redza R.    schedule 25.08.2018    source источник
comment
Ошибка была с кодом во втором операторе if. Я должен был использовать playerRigidbody.velocity.x вместо playerRigidbody.velocity.y. Упс.   -  person Redza R.    schedule 26.08.2018


Ответы (2)


Мне вся логика кажется странной, я бы сделал единый вектор движения

 playerRigidbody.velocity = new Vector2(Input.GetAxisRaw("Horizontal") * moveSpeed, Input.GetAxisRaw("Vertical") * moveSpeed);

если нет других забот.

Вполне возможно, что при таком количестве условий применяются только последние 2 из 4.

person Timofeus    schedule 25.08.2018
comment
Хотя я рад, я немного смущен, чтобы признать, что я нашел проблему. Я случайно использовал playerRigidbody.velocity = new Vector2(playerRigidbody.velocity.y, Input.GetAxisRaw(Vertical) * moveSpeed);. Когда это было на самом деле, это должен был быть playerRigidbody.velocity.x. - person Redza R.; 26.08.2018

Ошибка была с кодом во втором операторе «если». Я должен был использовать playerRigidbody.velocity.x вместо playerRigidbody.velocity.y. Упс.

person Redza R.    schedule 26.08.2018