问题描述
我有一个单元预制件,其中有一个带有 SpriteRenderer 的 GameObject。我正在实例化一个预制件的多个实例并为每个实例提供一个精灵。第一个单元格实例显示给定的精灵,但第二个不显示。
这里我创建了 Cell
的两个实例,并用来自 mIconManager
的精灵为 Cell 提供:
private void PopulateCells()
{
for (var i = 0; i < 2; i++)
{
GameObject goPrefab = Instantiate(goRawPrefab,CalculateCellPosition(i),Quaternion.identity,trBoard);
CellController cellController = goPrefab.GetComponent<CellController>();
cellController.FillContent(mIconManager.getSprite(i),i);
}
}
这是附加到 CellController
的 Cell
脚本的片段:
private void Awake()
{
mIcon = GameObject.Find("Iconsprite").GetComponent<SpriteRenderer>();
mCardBg = GameObject.Find("CardBg").GetComponent<SpriteRenderer>();
}
public void FillContent(Sprite sprite,int index)
{
mSprite = sprite;
mIcon.sprite = mSprite;
}
这是我的 Cell
预制件:
当我运行代码时,预制件的第二个实例没有获得精灵。
我在游戏运行时在检查器中检查了第一个预制件的 SpriteRenderer
,它说 anchovies
表示精灵 - 我通过 FillContent()
方法给出的精灵。有趣的是,第二个预制件的 SpriteRenderer
组件显示了 EMPTY
精灵。
游戏运行时第一个 Prefab 的 SpriteRenderer:
游戏运行时的第二个 Prefab 的 SpriteRenderer:
我错过了什么吗?我在互联网上搜索,发现一些帖子说“SpriteRenderer 没有第二次加载精灵”,但他们没有回答,回答的那些也没有解决我的问题。
附言我还尝试为 Cell
预制件的两个实例设置相同的精灵 - 仍然没有成功。
P.S.2。我记录了提供给 Cell
预制件的两个实例的精灵,它们不为 null 或为空。我什至做了 Debug.Log(mIcon.sprite)
这两个实例都记录了我提供的精灵的名称。
编辑:
为两个实例提供相同的精灵时记录:
public void FillContent(Sprite sprite,int index)
{
Debug.Log("hop,spriteName : " + sprite + ",prefabIndex : " + index);
mSprite = sprite;
mIcon.sprite = sprite;
}
解决方法
尝试用相同的精灵填充它两次代码看起来很正常 这将帮助我调试这一切,例如。
private void PopulateCells()
{
for (var i = 0; i < 2; i++)
{
GameObject goPrefab = Instantiate(goRawPrefab,CalculateCellPosition(i),Quaternion.identity,trBoard);
CellController cellController = goPrefab.GetComponent<CellController>();
cellController.FillContent(mIconManager.getSprite(1),i);
}
}
,
好的,事实证明问题与 SpriteRenderer 无关。 SpriteRenderer 按预期工作。但是,我获得对 SpriteRenderer 的引用的方式不正确。
在 CellController
中,我通过 GameObject.Find...
获得了对 SpriteRenderer 的引用,问题是它没有给我一个实例化的预制克隆的引用,而是第一个预制克隆的引用。
private void Awake()
{
mIcon = GameObject.Find("IconSprite").GetComponent<SpriteRenderer>();
mCardBg = GameObject.Find("CardBg").GetComponent<SpriteRenderer>();
}
相反,我使用了 tranform.Find
,一切都按预期工作。