当一个库存槽位中有一定数量的物品时,如何实现到另一个场景的过渡?

问题描述 投票:0回答:1

我真的需要游戏方面的帮助。当角色与舞台上的物体发生碰撞时,它们会被添加到库存中(相同类型的物品会添加到一个插槽中,仅“文本”字段中的数字会发生变化)。您需要实现一个移动到另一级别的条件:假设只有一个库存槽中有 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();
}

在提供的代码中,我实现目标的尝试是可见的,但不幸的是这仅适用于标签,我不明白还有什么问题以及是什么阻止了我的条件的正确验证。

c# unity-game-engine unityscript
1个回答
0
投票

您的代码的问题在于您正在检查:

if (itemPrefabs[i] == item)

当您比较两个不同的对象时,此条件将始终返回 false。即使它们是同一预制件的实例,它们仍然是两个不同的对象。

不幸的是,无法在运行时跟踪对象是从哪个预制件创建的。您可能应该使用标签或其他变量来比较项目。

例如类似

if (item.CompareTag(itemPrefabs[i].tag) 

只要您为每个项目赋予唯一的标签,就可能适合您的情况。

© www.soinside.com 2019 - 2024. All rights reserved.