我有一个名为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脚本附加到另一个对象,我会得到一个引用错误,但两个脚本都附加到同一个对象。如果有人能指出我在这里缺少什么,我会很感激。
这只是一个猜测,但激光控制器似乎是空的。由于两个脚本都在同一个游戏对象上,因此您可以使用GetComponent定义它们。
尝试改变
LaserController laserController;
至
LaserController laserController= this.GetComponent<LaserController>();
如果您有两个游戏对象,一个用于Player,另一个用于LaserController,您还可以将lasercontroller变量视为公共变量,并通过将游戏对象拖动到Unity中的变量来定义它。