【问题标题】:Cant print out last element of array correctly无法正确打印出数组的最后一个元素
【发布时间】:2019-01-30 13:54:01
【问题描述】:

我正在使用一个数组来存储所有带有“ChoosenItems”标签的游戏​​对象。如果图层选取了 8 个项目,它将打印出控制台中选择的所有项目。当我拿起最后一个项目时,它会打印出前 7 个的图像名称,最后一个项目仍然是“empty_item”。它将所有元素添加到数组中,但由于某种原因,最后一个元素不是最后一个被选中的项目。

我尝试使用 System.Threading.Thread.Sleep(5000); 延迟我的功能;

    public class PickUpItem : MonoBehaviour, IInteractable
    {
        public string DisplaySprite;
        public string DisplayImage;
        public static int counter;
        public static GameObject InventorySlots;
        public static GameObject[] PlayerItems = new GameObject[8];

        public void Interact(DisplayImage currentDisplay)
        {
            ItemPickUp();
        }

        void Start() { }
        void Update() { }

        public void ItemPickUp()
        {
            InventorySlots = GameObject.Find("Slots");
            int j;
            counter = 0;

            foreach (Transform slot in InventorySlots.transform)
            {
                if (slot.transform.GetChild(0).GetComponent<Image>().sprite.name == "empty_item")
                {
                    slot.transform.GetChild(0).GetComponent<Image>().sprite =
                        Resources.Load<Sprite>("Inventory Items/" + DisplaySprite);
                    Destroy(gameObject);
                    break;
                }

                if (counter <= 7)
                {
                    counter++;

                    if (counter >= 7)
                    {
                        {
                            Debug.Log("You have choosen all your items.");

                            System.Threading.Thread.Sleep(5000);
                            Debug.Log("Waiting 5 second.");

                            PlayerItems = GameObject.FindGameObjectsWithTag("ChoosenItem");

                            for (j = 0; j < 8; j++)
                            {
                                Debug.LogFormat("Item[{0}] = {1}", j, PlayerItems[j].GetComponent<Image>().sprite.name);
                            }
                        }
                    }
                }
            }
        }
    }

我希望输出是:

Item[0] = key_yellow
Item[1] = 2 spades
Item[2] = RocketSprite
Item[3] = color paper
Item[4] = 4 diamonds
Item[5] = CoinSprite
Item[6] = TruckChassisSprite
Item[7] = MagnetSprite

实际输出为:

Item[0] = key_yellow
Item[1] = 2 spades
Item[2] = RocketSprite
Item[3] = color paper
Item[4] = 4 diamonds
Item[5] = CoinSprite
Item[6] = TruckChassisSprite
Item[7] = empty_item

【问题讨论】:

  • 很难看出你的代码有什么问题,因为它是一个较大的代码库的摘录,孤立地不容易理解。我最好的猜测是将if (counter &gt;= 7) 更改为if (counter &gt; 7) 会解决您的问题。第二个if 的主体中的代码将在循环的第七次迭代中执行,因为它发生在 递增counter
  • 您能否说明将标签ChoosenItem 分配给GameObjects 的位置/方式?
  • 你在第 7 项告诉他们他们的 inv 已满而不是 8..
  • 我在统一引擎中创建了一个名为“ChoosenItem”的标签,并将其附加到每个库存槽项目。和你可以使用的“玩家”标签是一样的。
  • 不应该是“ChosenItems”吗?

标签: c# arrays unity3d inventory


【解决方案1】:

您是否尝试过单步执行您的代码?在您处理完第一个项目后,counter 将设置为 1。继续,在您处理完第七个项目后,counter 将设置为 7,并且这些项目将被打印出来。

尝试改变

if (counter &gt;= 7)

if (counter &gt; 7)

【讨论】:

  • 如果我这样做,if 语句将永远不会运行,因为计数器不会超过 7。
  • 再次,单步执行您的代码。您会看到,当您开始处理第 8 项时,计数器变量为 7。您将进入第一个 if 语句,将计数器增加到 8,然后进入第二个 if 语句。
猜你喜欢
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多