【问题标题】:Unity: RigidBody2D, how to move GameObject in straight lines (no curves)Unity:RigidBody2D,如何以直线移动游戏对象(无曲线)
【发布时间】:2020-11-08 04:06:59
【问题描述】:

大家好,我对 Unity 很陌生,也很困惑。

我正在创建一个自上而下、无重力的测试游戏,类似于 PacMan(即考虑角色直线运动)。

目前,我正在尝试以直线(无曲率)移动对象(见图)。

我的游戏对象附加了RigidBody2D,以及LinearAngularGravity设置为0。

我目前正在通过增加力来控制我的游戏对象:

private Rigidbody2D _playerRB2D;
public float _speed;

private void FixedUpdate()
{
    float moveHorizontal = Input.GetAxis("Horizontal");
    float moveVertical = Input.GetAxis("Vertical");
    Vector2 movement = new Vector2(moveHorizontal, moveVertical);

    _playerRB2D.AddForce(movement * _speed);
}

我们的想法是游戏对象不会减速,因此会不断运动(直线运动)。与物体的碰撞显然也很重要!

任何要查看的帮助或信息都会有很大帮助,谢谢!

【问题讨论】:

  • 我不确定,你能试试这个吗:Vector2 movement = new Vector2(moveHorizontal> moveVertical ? moveHorizontal: 0f, moveVertical> moveHorizontal ? moveVertical> :0f);

标签: c# unity3d 2d


【解决方案1】:

这个想法基本上是重置在每个改变方向上施加在rigidBody2D上的力。 实际上,您必须测试从水平输入的方向是否大于 x 轴的垂直方向,以及 y 轴的反方向,因此如果为真,则将相反的方向更改为 0f。 你通常会:

Vector2 movement = new Vector2(moveHorizontal < moveVertical ? moveHorizontal: 0f, moveVertical < moveHorizontal ? moveVertical: 0f);
_playerRB2D.velocity = movement * speed;

编辑:通过测试输入值,您可以使用模拟控制器移动 RigidBody2D,从而如您所愿地保持直线!

【讨论】:

  • 我认为问题在于rigidbody.AddForce 不会重置速度,而不是力量。
  • 感谢您的建议,尽管这似乎会导致奇怪的行为,即。游戏对象没有拾取输入方向,或轻微抖动。
【解决方案2】:

Unity 有一个内置的物理引擎,可以根据速度(和碰撞等)计算运动。通过使用 Rigidbody2D.AddForce,您可以增加刚体的速度。这意味着,如果您按向上箭头,然后按向右箭头,则按向上箭头的速度保持不变,从而导致对角速度和弯曲路径。如果你想要直线,你可以使用 Rigidbody2D.velocity 或者只使用 Transform.translate。

_playerRB2D.velocity = movement * _speed;

编辑:你说碰撞很重要,所以保持刚体

或移除rigidbody2D组件并使用

transform.Translate(movement * _speed);

【讨论】:

  • 谢谢!这似乎让我得到了我需要的东西。
猜你喜欢
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多