在 Unity 中移动物理精灵

Moving a Physics Sprite in Unity

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

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 分配给您的 sprite。

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

_rig = GetComponent<Rigidbody2D>();

但是如果您没有为您的 GameObject 分配 Rigidbody2D,它将 return 一个空引用。这就是异常的原因。

进入编辑器,select 层次结构面板中的游戏对象,然后在检查器面板中向其添加组件 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);