我遇到了问题。
在我的一个脚本中,当我尝试获取一个组件时,它在控制台中将此错误返回null:“NullReferenceException:找到需要对象实例的空值。”
我不知道为什么,因为在其他文件中我使用的过程运行正常。
这里我的代码流程:第一个 - GameController.cs
public class GameController : MonoBehaviour {
private SpawningPositions spawningPositions; //IT WORKS
private void Awake()
{
spawningPositions = GetComponent<SpawningPositions>(); //IT WORKS
}
void Start()
{
if (enemyWaveTypes.Length != 0 && wavesNumberEnemy.Length != 0)
{
StartCoroutine(SpawnShips());
}
}
IEnumerator SpawnShips()
{
while (true)
{
for (int i = 0; i < wavesNumberEnemy[waveCounter]; i++)
{
spawningPositions.SpawnRandom(enemyShip); //IT WORKS // NEXT SCRIPT
}
waveCounter++;
yield return new WaitForSeconds(waveTimingRatio);
}
}
}
第二个 - SpawningPositions.cs
public class SpawningPositions : MonoBehaviour {
GeoData geoData; //IT WORKS
private void Awake()
{
geoData = GetComponent<GeoData>(); //IT WORKS
}
public void SpawnRandom(Transform enemyShip)
{
Vector3 spawnPosition;
Tuple<int, float> tuple = geoData.GetRandomOuterBoundary(); //IT WORKS (i've got a custom class for Tuples)
int randomSpawn = tuple.Item1;
float randomPosition = tuple.Item2;
spawnPosition = geoData.GetRandomPointIn(tuple);
Quaternion spawnRotation = Quaternion.identity;
var myEnemy = Instantiate(enemyShip, spawnPosition, spawnRotation);
myEnemy.gameObject.AddComponent<FixedPointAndGo>(); // NEXT SCRIPT
}
}
最后一个,我遇到了问题 - FixedPointAndGo.cs
public class FixedPointAndGo : MonoBehaviour {
GeoData geoData; // DOESN'T WORK!!!
private void Awake()
{
geoData = gameObject.GetComponent<GeoData>(); // DOESN'T WORK!!! return NULL
}
private void Start()
{
endPos = new Vector3(
Random.Range(
(geoData.horizontalInLimits.x - 2), // DOESN'T WORK!!!
(geoData.horizontalInLimits.y - 2) // DOESN'T WORK!!!
),
0,
Random.Range(geoData.verticalInLimits.x, geoData.verticalInLimits.y) // DOESN'T WORK!!!
);
}
}
为什么当我尝试在第二个脚本中添加组件GeoData
时,而不是在第三个脚本中?我无法理解。
我尝试在此论坛和文档中搜索解决方案,但我还没有找到任何内容。
提前致谢
答案 0 :(得分:3)
geoData = gameObject.GetComponent<GeoData>(); // DOESN'T WORK!!! return NULL
注意变量“gameObject
”。这指的是这个GameObject这个脚本(FixedPointAndGo
)附加到。
这意味着gameObject.GetComponent<GeoData>()
只有<{1}}脚本 附加到游戏对象null
才会返回GeoData
1}}脚本附加到。
将FixedPointAndGo
附加到您附加GeoData
脚本的同一个游戏对象。
如果FixedPointAndGo
附加到另一个GameObject并且您想要访问它,那么在访问附加到它的GeoData
组件之前先找到该GameObject。
GeoData
最后,如果GameObject obj = GameObject.Find("NameOfGameObjectGeoDataIsAttachedTo");
geoData = obj.GetComponent<GeoData>();
脚本已附加到相同的GameObject GeoData
脚本,但您仍然获得FixedPointAndGo
,那么您错误地附加了另一个null
脚本到一个空的GameObject或另一个没有附加FixedPointAndGo
脚本的GameObject。
找到GameObject并从中删除GeoData
脚本。您可以选择FixedPointAndGo
脚本然后转到资产 ---&gt;来执行此操作。 在场景中查找引用并删除脚本。