2015-05-03 58 views
0

如何移动Unity中的物理Sprite?我是否像在farseers物理中一样对身体施加力量,还是移动角色精灵?这是我目前如何尝试移动它,并即时得到:在Unity中移动物理Sprite

的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)); 
    } 
+0

从[Rigidbody2D.velocity](http://docs.unity3d.com/ScriptReference/Rigidbody2D-velocity.html ):“价值通常不是直接设定,而是通过使用力量来设定”。 – dbc

+0

这就是我最初的做法,但是使用KeyCode.D语句只是因为原始方法不起作用。 “_rig.velocity = new Vector2(Mathf.Clamp(_rig.velocity.x,-_clampValue.x,_clampValue.x),Mathf.Clamp(_rig.velocity.y,-_clampValue.y,_clampValue.y));”用于设置速度的最小值和最大值。这就是物理原理的东西,但我会试着去看看它是如何工作的。 – KGSB

+0

拿出所有的钳线,它并没有帮助 – KGSB

回答

2

它只是看来你没有指派RigidBody2D到你的精灵。

我想,_rig在您启动或唤醒方法分配是这样的:

_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); 
+0

我来自Monogame和farseers物理,这是如何做farseer。我希望它会有点相同的笑声。谢谢。 – KGSB