2015-09-05 2 views
-1

Я работаю над учебником «Космический шутер» на веб-сайте единства (here), и у меня возникают проблемы со следующим кодом. Я пытаюсь установить ограничения на корабли Rigidbody, чтобы он не мог покинуть видимую область игры. Тем не менее, я получаю следующее сообщение об ошибке, и я не могу понять, почему (это буквально мой первый раз с помощью C# также, очень жаль, если это действительно очевидно, что не так):Unity tutorial (Space Shooter), C# NullReferenceException

Ошибка:

NullReferenceException: Object reference not set to an instance of an object 
PlayerController.FixedUpdate() (at Assets/Scripts/PlayerController.cs:28) 

я пометил строка 28 (упоминается в сообщении об ошибке) ниже

Сценарий:

using UnityEngine; 
using System.Collections; 

public class Boundary 
{ 
    public float xMin, xMax, zMin, zMax; 
} 

public class PlayerController : MonoBehaviour 
{ 

    public float speed; 
    public Boundary b; 
    public Rigidbody rb; 

    void Start() 
    { 
     rb = GetComponent<Rigidbody>(); 
    } 

    void FixedUpdate() { 
     float moveHorizontal = Input.GetAxis ("Horizontal"); 
     float moveVertical = Input.GetAxis ("Vertical"); 

     Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical); 
     rb.velocity = movement * speed; 

     rb.position = new Vector3( \\ *** line 28 *** 
      Mathf.Clamp (rb.position.x, b.xMin, b.xMax), 
      0.0f, 
      Mathf.Clamp (rb.position.z, b.zMin, b.zMax) 
     ); 

    } 
} 

Любая помощь в разрешении этой ошибки очень ценится, скрипт в самом учебнике не совместим с unit5, кажется, но я просто не вижу, как эта ошибка правильная.

+1

'b' is null? ... –

+0

Должен ли я сделать b = новый Граница или что-то в этом роде? – Totem

+1

Я не знаю, я понятия не имею, где вы хотите, или нужно инициализировать вещь. Но да, вам нужно где-то создать новую границу и назначить ее в поле. Если вы этого не сделаете, он останется пустым. –

ответ

1

Как вы упоминаете в комментариях, вы не инициализируется b в любом месте, так что null по умолчанию. Прочитайте значения по умолчанию и прочее here, а также посмотрите на разницу между типами значений и ссылочными типами, так как есть способ сделать свой тип Boundary.

Возможно, вы также захотите добавить конструктор в свой Boundary, чтобы его было проще создать.

public class Boundary 
{ 
    public float xMin, xMax, zMin, zMax; 

    public Boundary(float xMin, float xMax, ...) 
    { 
      // Set your fields. 
    } 
} 

А еще лучше, использовать Unity в Vector2 типа для хранения граничной информации.

public class Boundary 
{ 
    public Vector2 MinPoint; 
    public Vector2 MaxPoint; 

    public Boundary(Vector2 minPoint, Vector2 maxPoint) 
    { 
      MinPoint = minPoint; 
      MaxPoint = maxPoint; 
    } 
} 

Написание этого фрагмента было значительно менее болезненным, чем написание первого. Если вам действительно не нужно ничего, кроме способа сохранить эти 4 координаты, взгляните на Recthere, потому что у него вроде есть то, что вы хотите.

1

В вашем коде Boundary является ссылочным типом, что означает, что если вы не дадите ему значение, оно равно null. И в вашем коде я не вижу, чтобы вы присвоили значение b. Вот почему происходит NullReferenceException - b null! Может быть, вы можете сделать это в методе запуска:

b = new Boundary(); 
b.xMin = 1; 
b.xMax = 2; 
b.zMin = 3; 
b.zMax = 4; 
//The numbers are just examples. Change it however you want 

И что должно сделать b не нулевой. Или, вы можете добавить конструктор в Boundary классе:

public Boundary (int xMin, int xMax, int zMin, int zMax) { 
    this.xMin = xMin; 
    this.xMax = xMax; 
    this.zMin = zMin; 
    this.zMax = zMax; 
} 
Смежные вопросы