Я работаю над небольшим экспериментальным проектом в Unity. У меня есть 2d спрайт, который движется вперед со скоростью, но я хочу, чтобы он поворачивался влево или вправо по широкой дуге и продолжал двигаться в этом направлении при нажатии клавиш.
Фрагмент кода 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);
}
}
Кто-нибудь может указать мне правильное направление, что является на самом деле правильным способом реализации этого?
Не совсем уверен, что это то, чего вы пытаетесь достичь, но вот некоторый псевдокод того, что я придумал, чтобы вы начали...
По сути, когда нажимается направление, вы хотите увеличить скорость в этом направлении, пока вся скорость не будет указана в этом направлении. В то же время вы хотите уменьшить скорость в том направлении, в котором вы были раньше, до тех пор, пока она не станет нулевой.
Однако это упрощенная формула - если вы действительно хотите, чтобы скорость была постоянной на протяжении всей дуги, вам пришлось бы использовать некоторую геометрию, зная, что 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;
}
}