Как заставить 2d спрайт двигаться по гладкой широкой дуге в направлении нажатия клавиш?

2

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

  1. Я пытался настроить его угловую скорость, чтобы получить желаемый эффект. Выглядит неестественно, и он не перестанет вращаться.
  2. Пробовал Лерпинг. Выглядит неестественно.

Фрагмент кода 1:

bool forward = true;
Vector3 movement;

void FixedUpdate()
{
    if (forward)
    {
        //Moves forward
        movement = new Vector3(0.0f, 0.1f, 0.0f);
        rb.velocity = movement * speed;
    }


    if (Input.GetKeyDown(KeyCode.LeftArrow))
    {
        forward = false;
        movement = new Vector3(-0.05f, 0.05f, 0.0f);
        rb.velocity = movement * speed;
        rb.angularVelocity = 30;
    }

    if (transform.rotation.z == 90)
    {
        movement = new Vector3(-0.1f, 0.0f, 0.0f);
        rb.velocity = movement * speed;
        rb.angularVelocity = 0;
    }

}

Фрагмент кода 2:

void Update(){
    if (Input.GetKeyDown(KeyCode.LeftArrow))
    {
    Vector3 target = transform.position + new Vector3(-0.5f, 0.5f, 0);  
    transform.position 
    =Vector3.Lerp(transform.position,target,Time.deltaTime);
    transform.eulerAngles = Vector3.Lerp(transform.rotation.eulerAngles, 
    new Vector3(0, 0, 90), Time.deltaTime);
    }
}

Кто-нибудь может указать мне правильное направление, что является на самом деле правильным способом реализации этого?

Теги:
unity3d
game-physics
2d

1 ответ

0

Не совсем уверен, что это то, чего вы пытаетесь достичь, но вот некоторый псевдокод того, что я придумал, чтобы вы начали...

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

Однако это упрощенная формула - если вы действительно хотите, чтобы скорость была постоянной на протяжении всей дуги, вам пришлось бы использовать некоторую геометрию, зная, что V = (velX ^ 2 + velY ^ 2) ^. 5, но это получит ты довольно близко...

float yvel = 1f, xvel;
float t;

void Update()
{
    GetComponent<Rigidbody2D>().velocity = new Vector2(xvel, yvel);

    t += Time.deltaTime;
    if (Input.GetKeyDown(KeyCode.D))
    {
        t = 0;
        StartCoroutine(Move());
    }
}

private IEnumerator Move()
{
    while (t < 2) // at time t, yvel will be zero and xvel will be 1
    {
        yvel = 1 - .5f * t; // decrease velocity in old direction
        xvel = .5f * t; // increase velocity in new direction
        yield return null;
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню