我不明白为什么这不起作用:
Vector3 pos = new Vector3(x,0,y);
TerrainTiles.Add(Instantiate(Resources.Load("Prefabs/TerrainTile"), pos, Quaternion.identity) as TerrainTile);
Debug.Log("List items: " + TerrainTiles.Count.ToString());
TerrainTiles[TerrainTiles.Count - 1].xPosition = x;
运行Debug.Log
显示列表项正在创建中,但当我像上面最后一行代码中那样尝试引用其中任何一个时,我得到的是NullReferenceException
。
我不熟悉您正在使用的产品,但TerrainTiles
似乎是一个具有一个null
值的集合。如果是,.Count
仍将返回一个数字。检查你的路径。Resources.Load()
应该加载整个目录吗?
试试这个:
TerrainTile tile;
if((tile = Instantiate(Resources.Load("Prefabs/TerrainTile"), pos, Quaternion.identity) as TerrainTile) != null){
TerrainTiles.Add(tile);
}
首先,确保您的预制件可以访问,路径中包含文档中所述的"Resources"文件夹:http://docs.unity3d.com/Documentation/ScriptReference/Resources.html
其次,不能加载整个目录,一次只能加载一个特定的资源。因此,这里的"Premabs/TerrainTile"应该指一个名为TerrainTile.premab(或其他扩展名)的文件。
正如@drankin2112已经指出的那样,在将引用添加到列表(或任何集合)之前检查它更安全:
TerrainTile tile;
tile = Resources.Load("Prefabs/TerrainTile", typeof(TerrainTile)) as TerrainTile);
// Check whether resource exists
if (tile != null)
{
tile = Instantiate(tile, pos, Quaternion.Identity) as TerrainTile;
// Check whether instantiation worked
if (tile != null)
{
tileList.Add(tile);
}
}
这最终解决了问题:
TerrainTiles.Add(Instantiate(Resources.Load("Prefabs/TerrainTile", typeof(TerrainTile)), pos, Quaternion.identity) as TerrainTile);
感谢大家的建议和帮助。