Единство получает X & Y движения - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть проект единства сверху вниз. Игрок перемещается туда, где на экране происходит касание.

Мне бы хотелось, чтобы теперь анимация воспроизводилась правильно для направления движения игрока. Я настроил Blend Tree, который работает с мелкими деталями, и у меня есть параметры с плавающей запятой: Horizontal, Vertical и Magnitude.

Однако, когда я нажимаю на экран, анимация игрока не меняет направление или, если это происходит, указывает неверное направление на половине движения. Я уверен, что я использую значения X Y, но я не уверен, как получить правильные значения.

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

public class PlayerController : MonoBehaviour {

    float speed = 2f;
    Vector2 targetPos;

    private Rigidbody2D myRigidbody;
    private Animator myAnim;

    private void Start()
    {
        myRigidbody = GetComponent<Rigidbody2D>();
        myAnim = GetComponent<Animator>();
        targetPos = transform.position;
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            targetPos = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition);
        }
        if ((Vector2)transform.position != targetPos)
        {
            Move();
        }
    }

    void Move()
    {
        transform.position = Vector2.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);

        myAnim.SetFloat("Horizontal", transform.position.x);
        myAnim.SetFloat("Vertical", transform.position.y);
        myAnim.SetFloat("Magnitude", transform.position.magnitude);
    }
}

1 Ответ

0 голосов
/ 19 ноября 2018

Вам необходимо установить поплавки в соответствии с направлением движения, а не с новой позицией преобразования. Для этого вам нужно найти разницу между новой позицией и старой позицией и использовать вместо этого вектор.

Кроме того, поскольку вы передаете амплитуду отдельно, вы можете нормализовать вектор движения для компонентов. Это зависит от того, как настроены ваши смеси.

Однако, если ваше движение приведет вас к целевому положению, вместо этого вы захотите установить величину на ноль.

void Move()
{
    Vector2 oldPos = transform.position;
    transform.position = Vector2.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);

    Vector2 movement = transform.position - oldPos;

    if (transform.position == targetPos) 
    {
        myAnim.SetFloat("Magnitude", 0f);
    } 
    else 
    {
        myAnim.SetFloat("Magnitude", movement.magnitude);
    }

    # You may need to normalize for your components.
    # Vector2 movementNormed = movement.normalized;
    # myAnim.SetFloat("Horizontal", movementNormed.x);
    # myAnim.SetFloat("Vertical", movementNormed.y);

    # Otherwise, just use the ordinary components.
    myAnim.SetFloat("Horizontal", movement.x);
    myAnim.SetFloat("Vertical", movement.y);

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