#c# #unity3d #2d #game-physics
#c# #unity-игровой движок #2d #игра-физика
Вопрос:
Я работаю над небольшим экспериментальным проектом в Unity. У меня есть 2d-спрайт, который движется вперед со скоростью, но я хочу, чтобы он поворачивал влево или вправо по широкой дуге и продолжал двигаться в этом направлении при нажатии клавиши.
- Я попытался настроить его угловую скорость, чтобы получить желаемый эффект. Выглядит неестественно и вращение не прекращается.
- Пробовал Lerping. Также выглядит неестественно.
Фрагмент кода 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);
}
}
Кто-нибудь может указать мне правильное направление, каков действительно правильный способ реализовать это?
Ответ №1:
Не совсем уверен, что это то, чего вы пытаетесь достичь, но вот некоторый псевдокод из того, что я придумал, чтобы помочь вам начать…
По сути, когда нажато направление, вы хотите увеличить скорость в этом направлении, пока вся скорость не будет направлена в ту сторону. В то же время вы хотите уменьшить скорость в направлении, в котором вы ранее двигались, пока она не станет равной нулю.
Однако это упрощенная формула — если бы вы действительно хотели, чтобы скорость была постоянной по всей дуге, вам пришлось бы использовать некоторую геометрию, зная, что 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;
}
}