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

问题描述 投票:-1回答:1

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

激光控制器类

 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脚本附加到另一个对象,我会得到一个引用错误,但两个脚本都附加到同一个对象。如果有人能指出我在这里缺少什么,我会很感激。

c# unity3d
1个回答
1
投票

这只是一个猜测,但激光控制器似乎是空的。由于两个脚本都在同一个游戏对象上,因此您可以使用GetComponent定义它们。

尝试改变

LaserController laserController;

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

如果您有两个游戏对象,一个用于Player,另一个用于LaserController,您还可以将lasercontroller变量视为公共变量,并通过将游戏对象拖动到Unity中的变量来定义它。

© www.soinside.com 2019 - 2024. All rights reserved.