2015-05-03 77 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