旋转改变了对象的x轴

时间:2019-09-04 16:51:20

标签: c# unity3d

我需要使对象在场景中移动并跳跃,但是每次对象旋转时,它都会更改运动轴。如何确保对象的旋转不影响其运动?

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));
    }

2 个答案:

答案 0 :(得分:1)

transform.Translateoptional 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(用于跨越运动)相乘。