【问题标题】:Primitive inventory data原始库存数据
【发布时间】:2015-12-11 12:57:13
【问题描述】:

我一直在为一个 RPG 游戏构建一个非常基本的库存,我正在尝试作为一个小项目。

库存工作正常,唯一真正的问题是,一旦玩家填满袋子,脚本就会继续尝试拾取更多东西。

我遇到的另一个问题是修改代码,使其工作得更优雅。

这是完整的脚本,很长

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class inventoryRedo : MonoBehaviour 
{
    public GameObject fullWarning;
    public Sprite coalSprite;
    public Sprite manaPotionSprite;
    public Sprite healthPotionSprite;
    public Sprite shrimpSprite;

    private bool isPickingUp = false;

    public Button[] itemSlots;
    private bool isFull = false;
    private int itemNum = 0;


void Update()
{

    if (playerPickUp.hasPickedUpDroppedCoal == true)
    {
        itemNum = 1;
        if (itemNum == 1)
        {
            CheckForFreeSlot();
            playerPickUp.hasPickedUpDroppedCoal = false;

        }
    }
   if (playerPickUp.hasPickedUpHealthPot == true)
   {
        itemNum = 2;
        if (itemNum == 2)
        {
            CheckForFreeSlot();
            playerPickUp.hasPickedUpHealthPot = false;
        }
   }
    if (playerPickUp.hasPickedUpManaPot == true)
    {
        itemNum = 3;
        if (itemNum == 3)
        {
            CheckForFreeSlot();
            playerPickUp.hasPickedUpManaPot = false;
        }
    }
}


void CheckForFreeSlot()
{
    if (isFull == false)
    {
        if (itemSlots[0].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[0].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[0].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[0].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[0].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[0].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[0].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }

        }
        else if (itemSlots[1].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[1].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[1].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[1].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[1].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[1].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[1].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[2].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[2].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[2].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[2].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[2].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[2].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[2].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[3].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[3].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[3].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[3].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[3].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[3].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[3].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[4].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[4].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[4].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[4].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[4].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[4].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[4].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[5].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[5].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[5].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[5].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[5].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[5].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[5].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[6].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[6].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[6].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[6].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[6].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[6].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[6].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[7].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[7].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[7].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[7].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[7].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[7].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[7].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[8].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[8].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[8].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[8].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[8].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[8].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[8].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[9].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[9].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[9].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[9].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[9].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[9].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[9].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[10].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[10].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[10].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[10].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[10].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[10].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[10].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[11].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[11].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[11].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[11].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[11].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[11].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[11].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[12].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[12].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[12].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[12].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[12].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[12].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[12].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[13].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[13].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[13].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[13].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[13].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[13].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[13].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[14].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[14].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[14].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[14].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[14].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[14].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[14].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[15].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[15].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[15].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[15].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[15].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[15].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[15].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }


        else if (itemSlots[16].transform.tag == "slotFree")
        {
            if (itemNum == 1)
            {
                itemSlots[16].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[16].gameObject.GetComponent<Image>().sprite = coalSprite;
                itemNum = 0;
            }
            else if (itemNum == 2)
            {
                itemSlots[16].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[16].gameObject.GetComponent<Image>().sprite = healthPotionSprite;
                itemNum = 0;
            }
            else if (itemNum == 3)
            {
                itemSlots[16].transform.tag = "slotTaken";
                Sprite slotOne = itemSlots[16].gameObject.GetComponent<Image>().sprite = manaPotionSprite;
                itemNum = 0;
            }
        }else
        {
            print("No Room");
        }
    }

}

}

第一个问题是底部的else不起作用。

除此之外,我认为从这里你可以很快看出游戏拥有的物品越多,时间就会越长。

我一直在想办法进一步淡化这种情况,有点像为每个我想不出的物品栏设置一个具有自己功能的脚本。

我在想也许,有一个小函数循环遍历一个数组,检查第一个带有“freeSlot”标签的项目是什么,然后将项目放在那个槽中等等。

但真正的主要问题是脚本的 else 和底部没有触发。

【问题讨论】:

  • 感觉像是代码审查问题,而不是 stackoverflow。将所有 ifs/else ifs 交换为 foreach(Button but in ItemSlots)
  • humm... 我建议你看看 Lists 或 Dictionary Classes in c# ,我也会做的是创建一个 Item 类并有一个静态变量来说明我可以在我的库存中携带多少物品,还创建一种方法来添加物品和一种方法来删除它们。我认为你应该在这个脚本中修改很多东西,你复制/粘贴了很多代码......

标签: c# unity3d inventory


【解决方案1】:

我建议进行一些重新设计。首先,我会为插槽上课。我更喜欢数据对象类(但也可以是 MonoBehaviour):

public class CSlot
{
    public GameObject item;
    ...

}

然后创建一个具有选定大小的数组:

public class inventoryRedo : MonoBehaviour
{ 
    public CSlot[] inventory;

    private int FindIndexOfNextFreeSlot()
    {
        int nIndex = -1;
        for (int i=0; i < inventory.Length; i++)
        {
            if (inventory[i].item == null)
            {
                nIndex = i;
            }
        }
        return nIndex;
    }

    private void PutIntoInventory(int nIndex, GameObject gameObject)
    {
        inventory[nIndex].item == gameObject;
    }
}

然后我会做一些更改为playerPickUp,以便您可以这样做:

if (playerPickUp.PickedUpGameObject != null)
{
    int nIndex = FindIndexOfNextFreeSlot();
    if (nIndex > -1)
    {
        PutIntoInventory(nIndex, playerPickUp.PickedUpGameObject);
    }
}

有了这个,您可能不必经常重复自己。 希望你能明白。

【讨论】:

  • 为什么不使用代表实际库存的对象而不是空闲插槽的集合?
  • 是的,这将是另一种改进,还有更多可能。想给出想法,而不是解决方案......
  • 谢谢,这很有帮助。在进入这个阶段之前,库存已经经历了另外两次重新设计,而且确实需要另一个......
猜你喜欢
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2018-07-31
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多