Unity 2D: направление взгляда без движения

Я пытаюсь сделать игру про покемонов в unity2d. Мне удается сделать движение сетки, но я понятия не имею, как смотреть в сторону без движения (оставаться в том же месте и при однократном нажатии A, W, S или D просто смотреть в направлении без движения).

Вот что у меня есть на данный момент:

[SerializeField]
float walkingVelocity = 2;
[SerializeField]
float runingVelocity = 4;

Vector3 p;                                // For movement
Animator anim;

Vector2 input;
float actualSpeed = 0;

void Start()
{
    anim = GetComponent<Animator>();
    p = transform.position;          // Take the initial position
}

void FixedUpdate()
{
    input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
    actualSpeed = Input.GetKey(KeyCode.LeftShift) ? walkingVelocity : runingVelocity;

    if (input != Vector2.zero && p == transform.position)
    {

        //CalcularHierbaAlta();
        if (Mathf.Abs(input.x) > Mathf.Abs(input.y))
        {
            if (input.x > 0)
            {
                //direccion = Direccion.Este;
                //PuedeMoverse = CalcularFrente();
                p += Vector3.right;
                anim.SetFloat("input_x", input.x);
                anim.SetFloat("input_y", input.y);
                anim.SetBool("isMoving", true);
            }
            else
            {
                p -= Vector3.right;
                anim.SetFloat("input_x", input.x);
                anim.SetFloat("input_y", input.y);
                anim.SetBool("isMoving", true);
            }
        }
        else
        {
            if (input.y > 0)
            {
                p += Vector3.up;
                anim.SetFloat("input_x", input.x);
                anim.SetFloat("input_y", input.y);
                anim.SetBool("isMoving", true);
            }
            else
            {
                p -= Vector3.up;
                anim.SetFloat("input_x", input.x);
                anim.SetFloat("input_y", input.y);
                anim.SetBool("isMoving", true);
            }
        }
    }else if (input == Vector2.zero)
    {
        anim.SetBool("isMoving", false);
    }
    transform.position = Vector3.MoveTowards(transform.position, p, actualSpeed * Time.deltaTime);
}

Большое спасибо!


person James    schedule 04.04.2017    source источник


Ответы (2)


Убедитесь, что вы уже смотрите в каком-либо направлении. Если нет, то поверните ваш объект. Если вы уже стоите лицом в том направлении, в котором нажатие клавиши переместит вас, переместите игрока / объект.

person Austin    schedule 05.04.2017
comment
Боже мой, это было так очевидно! Я еще не пробовал, но это имеет большой смысл. Спасибо! :) - person James; 05.04.2017

у меня была точно такая же проблема, и вот как мне удалось это сделать;) строка

if (pressWalkTime >= 8) {

может использоваться для определения количества кадров, в течение которых кнопка может быть нажата, прежде чем начать движение в нужном направлении.

    if (horizontal != 0 || vertical != 0) {
        if (pressWalkTime != 0 || !direction.Equals (new Vector2 (horizontal, vertical))) {
            pressWalkTime++;

            if (pressWalkTime >= 8) {
                pressWalkTime = 0;
            }   
        } else {
            pressWalkTime = 0;
        }   

        direction = new Vector2 (horizontal, vertical);

        if (pressWalkTime == 0 && base.AttemptMove (horizontal, vertical)) {
            position += new Vector2 (horizontal, vertical);
        }

        if (horizontal == 1)
            animator.Play ("Walk-Right");

        if (horizontal == -1)
            animator.Play ("Walk-Left");

        if (vertical == 1)
            animator.Play ("Walk-Up");

        if (vertical == -1)
            animator.Play ("Walk-Down");

    } else
        pressWalkTime = 0;
} 

вы также должны заметить, что он не справляется с поворотами. это означает, что если вы уже идете в одном направлении, а затем поворачиваете в другом, вам придется снова подождать 8 кадров, чтобы начать движение. эта проблема будет решена завтра, но я уверен, что вы справитесь самостоятельно;)

pressWalkTime - это атрибут класса, в котором написана эта логика. Он инициализируется 0.

person T. Grumser    schedule 05.04.2017
comment
о, кстати, метод base.AttemptMove просто проверяет, доступно ли поле, которое вы хотите ввести. но я думаю, что это очевидно - person T. Grumser; 05.04.2017