实例化后,如何在通用列表中设置多个克隆的属性



我不明白为什么这不起作用:

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);

感谢大家的建议和帮助。

最新更新