我需要使对象在场景中移动并跳跃,但是每次对象旋转时,它都会更改运动轴。如何确保对象的旋转不影响其运动?
public float forca = 300f;
public Rigidbody2D Bola;
public float movdir = 5f;
public float moveesq = -5f;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Bola.AddForce(new Vector2(0, forca * Time.deltaTime), ForceMode2D.Impulse);
}
if (Input.GetKey(KeyCode.RightArrow))
{
Bola.transform.Translate(new Vector2(movdir * Time.deltaTime, 0));
}
if (Input.GetKey(KeyCode.LeftArrow))
{
Bola.transform.Translate(new Vector2(moveesq * Time.deltaTime, 0));
}
答案 0 :(得分:1)
transform.Translate
将optional parameter relativeTo
设为默认值Space.Self
→沿局部X轴移动
如果省略
relativeTo
或将其设置为Space.Self
,则相对于变换的局部轴应用移动。 (在“场景视图”中选择对象时显示的x,y和z轴。)如果relativeTo为Space.World
,则相对于世界坐标系应用移动。
只需将Space.World
作为最后一个参数传递即可将其转换为全局X轴(与对象方向无关):
if (Input.GetKey(KeyCode.RightArrow))
{
Bola.transform.Translate(new Vector2(movdir * Time.deltaTime, 0), Space.World);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
Bola.transform.Translate(new Vector2(moveesq * Time.deltaTime, 0), Space.World);
}
AddForce
无论如何都会获取世界空间坐标,因此您已经独立于对象的方向了。
但是,由于涉及到刚体,因此根本不应该使用Transform
组件来设置位置。您应该通过Rigidbody2D.MovePosition
if (Input.GetKey(KeyCode.RightArrow))
{
Bola.MovePosition(Bola.position + Vector2.right * movdir * Time.deltaTime);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
Bola.MovePosition(Bola.position + Vector2.right * moveesq * Time.deltaTime);
}
Yoi应该然后在FixedUpdate
答案 1 :(得分:0)
乘以transform.forward
当前,您的运动矢量在绝对坐标中。您希望它们在本地坐标中。最简单的方法是将transform.forward
(用于向前运动)和transform.right
(用于跨越运动)相乘。