Персонаж Unity2d, использующий движение WASD, продолжает разворачиваться назад к центру и может пройти только 1 единицу расстояния. - PullRequest
0 голосов
/ 11 июля 2020

всем, поэтому я пытаюсь создать простое движение WASD, основанное на движении сверху вниз. У меня есть 5 состояний анимации для движения вперед, назад, влево и вправо, а анимация в режиме ожидания - это просто статический c спрайт. По какой-то причине, когда я тестирую игру, я могу переместиться только на одну единицу расстояния по сетке, и персонаж возвращается в исходную точку. Есть ли способ исправить это? Большое спасибо!

Вот мой код:

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

public class PlayerMovement : MonoBehaviour {
    public Animator animator;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    

    private float speed = 6.5f;
    Vector3 pos;

    public float Speed { get => speed; set => speed = value; }

    void Update()
    {
        pos = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"), 0.0f);
        animator.SetFloat("Horizontal_f", pos.x);
        animator.SetFloat("Vertical_f", pos.y);

        if (Input.GetKey("w")) {
            pos.y += Speed * Time.deltaTime;
        }
        else if (Input.GetKey("s")) {
            pos.y -= Speed * Time.deltaTime;
        }
        else if (Input.GetKey("d")) {
            pos.x += Speed * Time.deltaTime;
        }
        else if (Input.GetKey("a")) {
            pos.x -= Speed * Time.deltaTime;
        }

        transform.position = pos;
        
    }
}

Вот аниматор: аниматор

blend tree

1 Ответ

0 голосов
/ 11 июля 2020

Измените свой код на это, потому что вы всегда меняете новый экземпляр вектора в каждом кадре, но вам нужно получить текущую позицию объекта и изменить ее.

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

public class PlayerMovement : MonoBehaviour {
    public Animator animator;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

   
    private float speed = 6.5f;

    public float Speed { get => speed; set => speed = value; }

    void Update()
    {
        Vector3 pos = transform.position;
    
        animator.SetFloat("Horizontal_f", Input.GetAxis("Horizontal"));
        animator.SetFloat("Vertical_f", Input.GetAxis("Vertical"));

        if (Input.GetKey("w")) {
            pos.y += Speed * Time.deltaTime;
        }
        else if (Input.GetKey("s")) {
            pos.y -= Speed * Time.deltaTime;
        }
        else if (Input.GetKey("d")) {
            pos.x += Speed * Time.deltaTime;
        }
        else if (Input.GetKey("a")) {
            pos.x -= Speed * Time.deltaTime;
        }

        transform.position = pos;
        
    }
}
...