Unity3D: Как вызвать метод, который создает префаб из другого класса? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть игровой объект с именем Player , и к нему прикреплены два сценария.Сценарий Player прослушивает ввод и вызывает метод из второго сценария с именем LaserController .

Второй сценарий отвечает за создание экземпляра префаба с компонентом LineRenderer и управляет тем, каклиния нарисована, и это жизненный цикл.Этот префаб прикреплен к этому сценарию в иерархии.

Если я объединю эти сценарии в один класс, проблем не будет.Но то, как я их использую, вызывает эту ошибку:

NullReferenceException: Object reference not set to an instance of an object

Класс игрока

 public class Player : MonoBehaviour
 {
     LaserController laserController;

     void Update()
     {
         if (Input.GetMouseButton(0))
         {
             laserController.ShootLaserBeam(Input.mousePosition); // NullReferenceException is thrown 
         }
         if (Input.GetMouseButtonUp(0))
         {
             laserController.RemoveLaserBeam();
         }
     }
 }

Лазерный контроллер Classs

 public class LaserController : MonoBehaviour
 {
     public GameObject laserPrefab;
     public GameObject laserInstance;

     public LineRenderer lineRenderer;
     public EdgeCollider2D edgeCollider;

     protected bool isBeamActive;

     public void ShootLaserBeam(Vector3 mousePosition)
     {
         if (isBeamActive == false)
         {
             CreateLaser(mousePosition);
         }
     }

     public void RemoveLaserBeam()
     {
         Destroy(edgeCollider);
         Destroy(laserInstance);
         isBeamActive = false;
     }

     private void CreateLaser(Vector3 mousePosition)
     {
         float turretY = transform.position.y;
         Vector2 turret = new Vector2(0, turretY);
         laserInstance = Instantiate(laserPrefab, Vector3.zero, Quaternion.identity);
         lineRenderer = laserInstance.GetComponent<LineRenderer>();
         edgeCollider = laserInstance.GetComponent<EdgeCollider2D>();

         isBeamActive = true;
         // do bunch of other things with the lineRenderer and Collider....
     }
 }

Если скрипт Controller был присоединен к другому объекту, я бы понял, почему существует ошибка ссылки, однако оба сценария прикреплены к одному и тому же объекту.Буду признателен, если кто-нибудь сможет указать, что мне здесь не хватает.

1 Ответ

0 голосов
/ 22 февраля 2019

Это только предположение, но кажется, что LaserController равен нулю.Поскольку оба сценария находятся в одном игровом объекте, вы можете определить его с помощью GetComponent.

Попробуйте изменить

LaserController laserController;

на

LaserController laserController= this.GetComponent<LaserController>();

Если у вас будет два игровых объекта,один для Player и один для LaserController. Вы можете также объявить переменную lasercontroller как общедоступную и определить ее, перетащив игровой объект на переменную в Unity.

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