我有一个名为 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脚本附加到另一个对象,那么我会明白为什么存在引用错误,但是两个脚本都附加到了同一对象。如果有人能指出我在这里缺少什么,我将不胜感激。
答案 0 :(得分:1)
这只是一个猜测,但是laserController本身为空。由于两个脚本都在同一个游戏对象上,因此可以使用GetComponent对其进行定义。
尝试更改
LaserController laserController;
收件人
LaserController laserController= this.GetComponent<LaserController>();
如果您有两个游戏对象,一个用于Player,一个用于LaserController,那么您也可以取消将lasercontroller变量公开,并通过将游戏对象拖到Unity中的变量来对其进行定义。