Unity3D:如何调用从另一个类实例化预制件的方法?

时间:2019-02-22 11:17:21

标签: c# unity3d

我有一个名为 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();
         }
     }
 }

激光控制器类

 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 :(得分:1)

这只是一个猜测,但是laserController本身为空。由于两个脚本都在同一个游戏对象上,因此可以使用GetComponent对其进行定义。

尝试更改

LaserController laserController;

收件人

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

如果您有两个游戏对象,一个用于Player,一个用于LaserController,那么您也可以取消将lasercontroller变量公开,并通过将游戏对象拖到Unity中的变量来对其进行定义。