我正在为我的游戏开发一个库存系统。我已经设置好了UI,我有这个。
如你所见,我有一个袋子面板,里面有很多插槽,就是你在图片右边看到的插槽。
我是这样填充的。
inventoryPanel.SetActive(true);
GameObject bagObject= GameObject.Find("Bag");
List<GameObject> childrens = new List<GameObject>();
Transform[] listSlots = bagObject.GetComponentsInChildren<Transform>();
foreach(Transform child in listSlots)
{
if(!child.gameObject.name.Equals(bagObject.name))
childrens.Add(child.gameObject);
}
for (int i = 0; i < character.ItemsInInventory.Count; i++)
{
if (character.ItemsInInventory[i] != -1)
{
GameObject slot = childrens[i];
print("Slot: " + slot.name);
Image imagen = childrens[i].GetComponent<Image>();
string ruta = GetRutaSprite(character.ItemsInInventory[i]);
Sprite icono = Resources.Load<Sprite>(ruta);
imagen.name = "Item";
imagen.sprite = icono;
print("parent is " + slot.name);
imagen.transform.SetParent(slot.transform);
}
}
当我运行这个时,我得到了这个。
如你所见,Slot0已经消失了,它被Item所取代。我想实现的是Item是Slot0的儿子。我不知道为什么会发生这种情况,因为我将图像的父级设置为槽。在 print("Slot: " + slot.name);
行打印 "Slot0",但在 print("parent is " + slot.name);
行,它打印的是项目。为什么会这样?另外,剑看起来像是在什么东西后面...没有正确显示。我想显示图标和槽的边框。
我怎样才能正确地填充我的库存?
在你的代码中,你只要找到槽,得到一个图片(就是边框),然后用你的物品sprite替换上面的sprite。
你需要实例化一个新的图像来代替。它可以是一个预制的,或者你可以使用你的边框图像来创建一个副本(不要忘记改变颜色)。或者,如果你在槽内有一个单独的图像,而你想为它设置精灵,你需要在它上获得参考,而不是在边框上。为此,你需要在你的slot上添加一个脚本,以保持该引用。
如果要对你的代码做一个最小的改动,你可以这样做。
Sprite icono = Resources.Load<Sprite>(ruta);
Image newImage = Instantiate(imagen, slot.transform);
newImage .name = "Item";
newImage .sprite = icono;
print("parent is " + slot.name);
newImage.transform.SetParent(slot.transform);
但我还是建议你重新修改一下: 至少,在你的插槽上添加一个脚本,保留对第二个图像的引用(不是边界)。