揹包系統(二)各個部分的整合和整體功能的實現
阿新 • • 發佈:2019-02-14
一、揹包的拾取功能:
在獲得一個新物品時,需要把該物品放到揹包中進行分配,這時候就會出現以下幾種情況:
(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部分就製作完成了。接下來需要做的就是把道具的資訊和揹包聯結起來,並進行具體圖示的繪製。