gameObject.GetComponent返回null

时间:2018-02-09 15:43:39

标签: c# unity3d

我遇到了问题。

在我的一个脚本中,当我尝试获取一个组件时,它在控制台中将此错误返回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时,而不是在第三个脚本中?我无法理解。

我尝试在此论坛和文档中搜索解决方案,但我还没有找到任何内容。

提前致谢

1 个答案:

答案 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;来执行此操作。 在场景中查找引用并删除脚本。