2015-08-06 4 views
0

Я не знаю, почему я его получаю. Он появляется только тогда, когда raycast ударяет по объекту.Почему я получаю исключение NullReferenceException, когда пытаюсь выписать тег игрового объекта, что было поражено raycast?

void Update(){ 
RaycastHit2D hitSideRight = new RaycastHit2D(); 
      hitSideRight = Physics2D.Raycast (transform.position, Vector2.right, 1.2f, 1 << LayerMask.NameToLayer("Ground")); 
      Debug.DrawRay (transform.position, Vector2.right* 1.2f); 

      RaycastHit2D hitSideLeft = new RaycastHit2D(); 
      hitSideLeft = Physics2D.Raycast (transform.position, -Vector2.right, 1.2f, 1 << LayerMask.NameToLayer("Ground")); 
      Debug.DrawRay (transform.position, -Vector2.right* 1.2f); 

      if(hitSideLeft.collider != null || hitSideRight.collider != null){ 
       CancelMove(); 
       Debug.Log(hitSideRight.collider.tag.ToString()); 
      } 
} 

Я получаю сообщение об ошибке для этой строки кода (только тогда, когда луч контактирует с объектом): Debug.Log(hitSideRight.collider.tag.ToString());

+0

Вы получить NRE, когда он фактически столкнулся с левой стороной (что делает ваше условие истинным), а не правой? И нет необходимости в «новых» двух ваших RaycastHit2D. – Bart

+0

, но если я не использую новый, это просто простой указатель, не так ли? – Gabe

ответ

1

Replace || для &&, потому что если hitSideLeft является не утратившим hitSideRight является пустым, условие будет верно и вы получите NullPointer

if(hitSideLeft.collider != null || hitSideRight.collider != null){ 
    CancelMove(); 
    Debug.Log(hitSideRight.collider.tag.ToString()); 
} 
+0

Ох ... Я не заметил, что написал «hitSideRight», а не «Left» – Gabe

1

вы ча п попробовать это вместо того, чтобы, если вы хотите сохранить ||

RaycastHit2D col = hitSideLeft.collider ?? hitSideRight.collider; 
if(col != null){ 
    CancelMove(); 
    Debug.Log(col.tag.ToString()); 
} 

Но вы должны знать ... Physics2D.Raycast(...) Возвращает bool не RaycastHit2D

ваши raycasts должны выглядеть так:

RaycastHit2D hitSideRight; 
Ray ray = new Ray(transform.position, Vector2.right); 
if(Physics2D.Raycast (ray, out hitSideRight, 1.2f, 1 << LayerMask.NameToLayer("Ground"))) 
{} 
+1

Я второй второй кусок кода. – Reasurria