我真的需要游戏方面的帮助。当角色与舞台上的物体发生碰撞时,它们会被添加到库存中(相同类型的物品会添加到一个插槽中,仅“文本”字段中的数字会发生变化)。您需要实现一个移动到另一级别的条件:假设只有一个库存槽中有 3 个草莓(也就是说,应该检查草莓标签并检查是否存在数字 3)该插槽的文本字段)。
请帮我修复代码。使用 Debug.Log 我发现标签检查工作正常。关于检查文本字段有什么不能说的:要么是那里的值在某种程度上被错误地读取,要么是 Full[i] 和索引存在问题。我真的希望得到答案,非常感谢!
public bool[] isFull;
public GameObject[] slots;
public GameObject inventory;
private bool inventoryOn;
private int[] itemCounts;
private GameObject[] itemPrefabs;
private int strawberryCount = 0;
private void Start()
{
inventoryOn = false;
itemCounts = new int[slots.Length];
itemPrefabs = new GameObject[slots.Length];
}
public void Chest()
{
if (inventoryOn == false)
{
inventoryOn = true;
inventory.SetActive(true);
}
else
{
inventoryOn = false;
inventory.SetActive(false);
}
}
public bool HasEnoughStrawberries(int amount)
{
return strawberryCount >= amount;
}
public void AddItem(GameObject item)
{
if (item.CompareTag("strawberry")) // все префабы нужного предмета имеют тег "strawberry"
{
strawberryCount++;
if (HasEnoughStrawberries(3))
{
SceneManager.LoadScene("Second_MagicForest");
}
}
for (int i = 0; i < slots.Length; i++)
{
if (itemPrefabs[i] == item)
{
itemCounts[i]++;
UpdateItemCountText(i);
return;
}
else if (!isFull[i])
{
isFull[i] = true;
GameObject newItem = Instantiate(item, slots[i].transform);
itemPrefabs[i] = item;
itemCounts[i] = 1;
UpdateItemCountText(i);
return;
}
}
}
private void UpdateItemCountText(int index)
{
Text countText = slots[index].transform.GetChild(0).GetComponentInChildren<Text>();
countText.text = itemCounts[index].ToString();
}
在提供的代码中,我实现目标的尝试是可见的,但不幸的是这仅适用于标签,我不明白还有什么问题以及是什么阻止了我的条件的正确验证。
您的代码的问题在于您正在检查:
if (itemPrefabs[i] == item)
当您比较两个不同的对象时,此条件将始终返回 false。即使它们是同一预制件的实例,它们仍然是两个不同的对象。
不幸的是,无法在运行时跟踪对象是从哪个预制件创建的。您可能应该使用标签或其他变量来比较项目。
例如类似
if (item.CompareTag(itemPrefabs[i].tag)
只要您为每个项目赋予唯一的标签,就可能适合您的情况。