我正在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;
}
}