Как переместить спрайт с помощью клавиш WASD в 2D игре? - PullRequest
0 голосов
/ 26 сентября 2019

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

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

public class PlayerMovement : MonoBehaviour
{

    public Sprite Up;
    public Sprite Down;
    public Sprite Right;
    public Sprite Left;
    public float speed;


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

        Vector3 move = transform.position;

        if (Input.GetKey(KeyCode.W))
        {
            GetComponent<SpriteRenderer>().sprite = Up;
            move.z += speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.A))
        {
            GetComponent<SpriteRenderer>().sprite = Left;
            move.x -= speed * Time.deltaTime; 
        }
        if (Input.GetKey(KeyCode.D))
        {
            GetComponent<SpriteRenderer>().sprite = Right;
            move.x += speed * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.S))
        {
            GetComponent<SpriteRenderer>().sprite = Down;
            move.y -= speed * Time.deltaTime;
        }

      transform.position = move; 
    }
}

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

Ответы [ 3 ]

1 голос
/ 26 сентября 2019

В вашем случае move увеличивается каждый раз, когда проходит if оператор.Есть два способа отключить двустороннее движение: либо переписать move в каждом if, либо выйти из функции формы после первого прохождения if.

Также есть еще одна проблема в вашем скрипте: вам нужно обновить x ось для кнопок A / D и z ось для W / S.

Например:

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

public class PlayerMovement : MonoBehaviour
{
    public Sprite Up;
    public Sprite Down;
    public Sprite Right;
    public Sprite Left;
    public float speed;


    // Update is called once per frame
    void Update()
    {
        Vector3 move;

        if (Input.GetKey(KeyCode.W))
        {
            GetComponent<SpriteRenderer>().sprite = Up;
            move = new Vector3(-speed * Time.deltaTime, 0, 0);
        }
        if (Input.GetKey(KeyCode.A))
        {
            GetComponent<SpriteRenderer>().sprite = Left;
            move = new Vector3(0, 0, speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.D))
        {
            GetComponent<SpriteRenderer>().sprite = Right;
            move = new Vector3(speed * Time.deltaTime, 0, 0);
        }
        if (Input.GetKey(KeyCode.S))
        {
            GetComponent<SpriteRenderer>().sprite = Down;
            move = new Vector3(0, 0, -speed * Time.deltaTime);
        }

        transform.position += move;
    }
}
1 голос
/ 26 сентября 2019

Во-первых, вы должны кэшировать свой SpriteRenderer, здесь вы делаете до 4 вызовов GetComponent только для движения.

Затем вы не хотите напрямую устанавливать положение вашего объекта, но перемещаете его,Вы можете либо выполнить transform.Translate (переместить), либо transform.position + = move;

edit: и вам, вероятно, следует назначить спрайт на основе последнего движения.Здесь вы будете переопределять его каждый раз, так как ваши ifs не являются исключительными

0 голосов
/ 26 сентября 2019

Решение:

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

public class PlayerMovement : MonoBehaviour
{

    public Sprite Up;
    public Sprite Down;
    public Sprite Right;
    public Sprite Left;
    public float speed;



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

        Vector3 move;

        if (Input.GetKey(KeyCode.W))
        {
            GetComponent<SpriteRenderer>().sprite = Up;
            move = new Vector2(0, speed * Time.deltaTime);

            transform.position += move;
        }
        if (Input.GetKey(KeyCode.A))
        {
            GetComponent<SpriteRenderer>().sprite = Left;
            move = new Vector2(speed * Time.deltaTime, 0);

            transform.position -= move;
        }
        if (Input.GetKey(KeyCode.D))
        {
            GetComponent<SpriteRenderer>().sprite = Right;
            move = new Vector2(speed * Time.deltaTime, 0);

            transform.position += move;
        }
        if (Input.GetKey(KeyCode.S))
        {
            GetComponent<SpriteRenderer>().sprite = Down;
            move = new Vector2(0,speed * Time.deltaTime);

            transform.position -= move;
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...