【问题标题】:Moving a Physics Sprite in Unity在 Unity 中移动物理精灵
【发布时间】:2015-05-03 16:05:21
【问题描述】:

如何在 Unity 中移动物理精灵?我是像 Farseers 物理学那样对身体施加力,还是移动角色精灵?这就是我目前正在尝试移动它并得到的方式:

NullReferenceException: UnityEngine.Rigidbody2D.get_velocity()

    _position.x = Input.GetAxis ("Horizontal");
    _position.y = Input.GetAxis ("Vertical");

    if (Input.GetKeyDown(KeyCode.Space))
    {   
        _rig.AddForce(new Vector2(_rig.velocity.x, _jumpHeight));
        _rig.velocity = new Vector2(Mathf.Clamp(_rig.velocity.x, -_clampValue.x, _clampValue.x), Mathf.Clamp(_rig.velocity.y, -_clampValue.y, _clampValue.y));
    }

    if (Input.GetKey(KeyCode.D))
    {
        //_rig.AddForce(new Vector2(_moveSpeed, _rig.velocity.x));
        //_rig.velocity = new Vector2(Mathf.Clamp(_rig.velocity.x, -_clampValue.x, _clampValue.x), Mathf.Clamp(_rig.velocity.y, -_clampValue.y, _clampValue.y));
        _rig.velocity = new Vector2(_position.x * _moveSpeed, _rig.velocity.y);
    }

    if (Input.GetKey(KeyCode.A))
    {
        _rig.AddForce(new Vector2(-_moveSpeed, _rig.velocity.y));
        _rig.velocity = new Vector2(Mathf.Clamp(_rig.velocity.x, -_clampValue.x, _clampValue.x), Mathf.Clamp(_rig.velocity.y, -_clampValue.y, _clampValue.y));
    }

【问题讨论】:

  • 来自Rigidbody2D.velocity:“通常不直接设置该值,而是通过强制设置”。
  • 这就是我最初所做的,但使用 KeyCode.D 语句只是因为原始方法不起作用。 “_rig.velocity = new Vector2(Mathf.Clamp(_rig.velocity.x,-_clampValue.x,_clampValue.x),Mathf.Clamp(_rig.velocity.y,-_clampValue.y,_clampValue.y));”用于设置速度的最小值和最大值。这就是 Farseers 物理学的工作原理,但我会尝试把它拿出来看看它是如何工作的。
  • 取出所有的夹线并没有帮助

标签: c# unity3d unity3d-2dtools


【解决方案1】:

您似乎没有将 RigidBody2D 分配给您的精灵。

我想 _rig 在您的 Start 或 Awake 方法中是这样分配的:

_rig = GetComponent<Rigidbody2D>();

但是,如果您没有将 Rigidbody2D 分配给您的游戏对象,它将返回一个空引用。这就是异常的原因。

进入编辑器,在 Hierarchy 面板中选择您的 GameObject,然后在 Inspector 面板中添加一个组件 Rigidbody2D。

你加力的方式也是错误的。您需要传递一个表示移动方向的 Vector2。顺便说一句,您不能将速度限制为负值,因为速度始终是正值。

总而言之,您在处理输入的方式上犯了一个错误。您使用 Input.GetAxis 获取轴值并使用 A 和 D 键启动移动。也许它可以工作,因为默认情况下 A 和 D 是用于水平轴和垂直轴的键,但它可能会在以后导致错误。

出于所有这些原因,我建议您以这种方式编辑您的代码:

float horizontal = Input.GetAxis ("Horizontal");

if (Input.GetKeyDown(KeyCode.Space))
    _rig.AddForce(new Vector2(0, _jumpHeight));

if (horizontal < 0)
    _rig.AddForce(new Vector2(-_moveSpeed, 0));
if (horizontal > 0)
    _rig.AddForce(new Vector2(_moveSpeed, 0));

if (_rig.velocity.x > _clampValue.x)
    _rig.velocity = new Vector2(_clampValue.x, _rig.velocity.y);
if (_rig.velocity.y > _clampValue.y)
    _rig.velocity = new Vector2(_rig.velocity.x, _clampValue.y);

【讨论】:

  • 我来自 Monogame 和 farseers 物理学,这就是 farseer 的工作方式。我希望它会有点相同,哈哈。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
相关资源
最近更新 更多