1. 程式人生 > >揹包系統(二)各個部分的整合和整體功能的實現

揹包系統(二)各個部分的整合和整體功能的實現

一、揹包的拾取功能:

在獲得一個新物品時,需要把該物品放到揹包中進行分配,這時候就會出現以下幾種情況:

(1)如果已有該物體:該物體的num+1;

(2)如果沒有該物體,則查詢是否有空格:

               若有空格,將該物體放在有的第一個編號的空格里。在當前的空格內例項化物體。

               若沒有空格,顯示揹包已滿。      

實現程式碼如下:

void Update () {
        if (Input.GetKeyDown(KeyCode.X))
        {
            GetSomething(Random.Range(1001, 1004));
        }
    }

    private void GetSomething(int id)
    {
        InventoryItemGrid grid = null;
        //檢測grid中有沒有當前物體
        foreach (InventoryItemGrid temp in itemGridList)
        {
            if (temp.id == id)
            {
                grid = temp;
                break;
            }
        }
        if (grid != null)//有當前物體 num加1
        {
            grid.PlusNum(1);
        }
        else//沒有當前物體 查詢是否有空格 根據id是否為0判斷
        {
            foreach (InventoryItemGrid temp in itemGridList)
            {
                if (temp.id == 0)
                {
                    grid = temp;
                    break;
                }
            }

            if (grid != null)//有空格
            {
                //在當前格例項化物體
                GameObject go = NGUITools.AddChild(grid.gameObject, inventoryItemGameobject);
                go.transform.localPosition = Vector3.zero;
                go.GetComponent<UISprite>().depth = 8;
                grid.SetId(id);

            }
            else//沒有空格
            {
                print("揹包滿了");  
            }

        }
    }


二、揹包的拖拽功能:

比較簡單,已在前文中提到並實現。

這裡要增加的功能為:區分拖拽到空格或有物品的格子。

要實現該功能,首先應該為元件新增一個TAG,用於區分碰撞事件所接觸到的物體的型別。為了方便管理Tag,添加了一個Tags指令碼。

using UnityEngine;
using System.Collections;

public class Tags : MonoBehaviour {

    public const string GROUND = "Ground";
    public const string PLAYER = "Player";
    public const string INVENTORY_ITEM = "InventoryItem";
    public const string INVENTORY_ITEM_GRID = "InventoryItemGrid";
}

在拖拽事件中,surface用於代表拖放結束時碰撞的物體。

protected override void OnDragDropRelease(GameObject surface)
    {
        base.OnDragDropRelease(surface);

        if (surface != null)
        {
            //拖放到一個有物體的格子
            if (surface.tag == Tags.INVENTORY_ITEM)
            {
                InventoryItemGrid oldGrid = this.transform.parent.GetComponent<InventoryItemGrid>();
                int id = oldGrid.id;
                int num = oldGrid.num;
                InventoryItemGrid newGrid = surface.transform.parent.GetComponent<InventoryItemGrid>();

                //交換資料
                oldGrid.SetId(newGrid.id, newGrid.num);
                newGrid.SetId(id, num);

                ResetPosition();
            }
            //拖放到一個空格子
            else if (surface.tag == Tags.INVENTORY_ITEM_GRID)
            {
                //拖放到自己的格子
                if (surface.transform.parent == this.transform.parent)
                {
                    ResetPosition();
                }
                else//其他空格子 
                {
                    InventoryItemGrid oldGrid = this.transform.parent.GetComponent<InventoryItemGrid>();

                    InventoryItemGrid nowGrid = surface.GetComponent<InventoryItemGrid>();
                    this.transform.parent = surface.transform;
                    ResetPosition();
                    nowGrid.SetId(oldGrid.id, oldGrid.num);
                    oldGrid.ClearInfo();
                }

            }
            else
            {
                ResetPosition();
            }
        }
        else
        {
            ResetPosition();
        }
    }

    private void ResetPosition()
    {
        transform.localPosition = Vector3.zero;
    }

三、揹包的整理功能:

在實際操作中,有可能出現揹包中的物品因為玩家的隨意拖拽,排列很散亂的情況。這時候點選整理按鈕就可以把所有的物體都從前到後排列整齊。

要實現這個功能,可以將所有的格子都遍歷一遍,記下空格的索引,然後從最小的索引開始向後迴圈,將所有的格子從後向前遍歷,如果格子中有物體,就把它移動到該空格索引對應的格子中去,然後繼續迴圈操作。

實現程式碼如下:

//整理揹包物品
    public void OnArrangeInventory()
    {
        List<int> nullGridIndexList = new List<int>();
        for (int i = 0; i < itemGridList.Count; i++)
        {
            if (itemGridList[i].id == 0)
            {
                nullGridIndexList.Add(i);
            }
        }
        //揹包滿了不整理
        if (nullGridIndexList.Count != 0)
        {
            
            foreach (int index in nullGridIndexList)
            {

                for (int i = itemGridList.Count - 1; i > index; i--)
                {
                    if (itemGridList[i].id != 0)
                    {
                        if (i > index)
                        {
                            ExchangeItemToANullGrid(index, i);
                            break;
                        }
                        else
                            break;
                    }
                }
            }
        }
    }

    //index為空格子索引, i為有物品的格子
    private void ExchangeItemToANullGrid(int index, int i)
    {

        Transform transform = itemGridList[i].GetComponentInChildren<InventoryItem>().gameObject.transform;
        transform.parent
            = itemGridList[index].transform;
        transform.localPosition = Vector3.zero;
        itemGridList[index].SetId(itemGridList[i].id, itemGridList[i].num);
        itemGridList[i].ClearInfo();
    }
至此,揹包的UI部分就製作完成了。接下來需要做的就是把道具的資訊和揹包聯結起來,並進行具體圖示的繪製。