Unity Player 2D Movement - PullRequest
       0

Unity Player 2D Movement

0 голосов
/ 29 февраля 2020

Здравствуйте, дорогие программисты,

У меня есть проект в школе для написания кода игры в Unity. Unity очень сложен для понимания и всех дополнительных возможностей. Я хотел сделать игру, похожую на покемонов, вдохновленную другой игрой.

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

Я думал, что изменение гравитации и чувствительности может переместить его быстрее по карте. Мой плеер также позволяет мне нажимать одну клавишу за раз, поэтому мне нужно подождать, пока игрок переместит длину плитки, а затем я могу изменить направление. У меня также нет особых знаний о том, как работает код (математические вещи). Я надеюсь, что дал вам достаточно информации

using UnityEngine;
using System.Collections;

public class PlayerMovement : MonoBehaviour {

    Direction currentDir;
    Vector2 input;
    bool isMoving = false;
    Vector3 startPos;
    Vector3 endPos;
    float t;

    public Sprite northSprite;
    public Sprite eastSprite;
    public Sprite southSprite;
    public Sprite westSprite;

    public float walkSpeed = 1f;

    public bool isAllowedToMove = true;

    void Start()
    {
        isAllowedToMove = true;
    }

    void Update () { 

        if(!isMoving && isAllowedToMove)
        {
            input = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
            if (Mathf.Abs(input.x) > Mathf.Abs(input.y))
                input.y = 0;
            else
                input.x = 0;

            if(input != Vector2.zero)
            {

                if(input.x < 0)
                {
                    currentDir = Direction.West;
                }
                if(input.x > 0)
                {
                    currentDir = Direction.East;
                }
                if(input.y < 0)
                {
                    currentDir = Direction.South;
                }
                if (input.y > 0)
                {
                    currentDir = Direction.North;
                }

                switch(currentDir)
                {
                    case Direction.North:
                        gameObject.GetComponent<SpriteRenderer>().sprite = northSprite;
                        break;
                    case Direction.East:
                        gameObject.GetComponent<SpriteRenderer>().sprite = eastSprite;
                        break;
                    case Direction.South:
                        gameObject.GetComponent<SpriteRenderer>().sprite = southSprite;
                        break;
                    case Direction.West:
                        gameObject.GetComponent<SpriteRenderer>().sprite = westSprite;
                        break;
                }

                StartCoroutine(Move(transform));
            }

        }

    }

    public IEnumerator Move(Transform entity)
    {
        isMoving = true;
        startPos = entity.position;
        t = 0;

        endPos = new Vector3(startPos.x + System.Math.Sign(input.x), startPos.y + System.Math.Sign(input.y), startPos.z);

        while (t < 1f)
        {
            t += Time.deltaTime * walkSpeed;
            entity.position = Vector3.Lerp(startPos, endPos, t);
            yield return null;
        }

        isMoving = false;
        yield return 0;
    }
}

enum Direction
{
    North,
    East,
    South,
    West
}

1 Ответ

0 голосов
/ 02 марта 2020

Причина, по которой код допускает использование только одной клавиши за раз (до завершения движения игрока), заключается в том, что функция Update - это место, где код ловит ваши клавиши ввода, а оператор if внутри этой функции не соответствует условиям, пока персонаж движется.

if(!isMoving && isAllowedToMove)

Если этот оператор соответствует требованиям и вы вводите клавишу для перемещения игрока, запускается функция перемещения.

StartCoroutine(Move(transform));

Эта функция перемещения устанавливает логическое значение isMoving до true ( isMoving должно быть false , чтобы соответствовать условиям в первом операторе if). Это логическое значение не устанавливается на false , пока персонаж не переместится по длине плитки, которая закодирована в то время как l oop.

while (t < 1f)
{
    t += Time.deltaTime * walkSpeed;
    entity.position = Vector3.Lerp(startPos, endPos, t);
    yield return null;
}

Я предлагаю начать с играя с этим, пока l oop, так как похоже, что игрок не может двигаться, пока не закончится l oop.

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