遊戲開發學習筆記(七)開發揹包系統
阿新 • • 發佈:2019-01-09
思路:
Bag:管理揹包裡的格子
BagItemGrid:管理格子儲存物品的資訊(id及num)
BagItem:管理物品拖拽功能及物品物品的更新顯示
Bag:管理揹包裡的格子
建立UI,Bag_item 和Bag_item_grid的Prefab,
Bag新增Bag指令碼,Bag_item新增BagItem指令碼,Bag_item_grid新增BagItemGrid指令碼
編輯Bag指令碼,處理拾取物品並新增到物品欄裡的事件
public class Bag : MonoBehaviour { public static Bag _instance; public List <BagItemGrid> itemGridList = new List<BagItemGrid>(); public UILabel moneynumberLabel; public GameObject bagItemPrefab; private int moneynumber; void Awake(){ _instance = this; } void Update(){ } //拾取到id的物品,並新增到物品欄裡 public void GetId(int id,int num =1){ //查詢是否已存在該物品 //如果存在,則num+1; //如果不存在,查詢空的方格,然後把新建立的物品放到空格里 BagItemGrid grid = null; foreach (BagItemGrid temp in itemGridList) { if (temp.id == id) { grid = temp; break; } } if (grid != null) { //揹包中存在該物品,物品數量num+1; grid.PlusNum(num); } else { //揹包中不存在該物品 foreach(BagItemGrid temp in itemGridList){ if (temp.id == 0) { //查詢到空的格子 grid = temp; break; } } if (grid != null) { GameObject itemGO = NGUITools.AddChild (grid.gameObject, bagItemPrefab); //使用NGUITools新增UI物體 itemGO.transform.localPosition = Vector3.zero; //把新增的物品位置歸零 grid.SetId(id,num); //將物品顯示出來 } } } }
BagItemGrid:管理格子儲存物品的資訊(id及num)
BagItemGrid儲存的是物品的id和num,以及處理關於這兩個屬性的事件
public class BagItemGrid : MonoBehaviour { public int id = 0; public int num = 0; private UILabel numLabel; private ObjectInfo info = null; void Start () { numLabel = this.GetComponentInChildren<UILabel> (); } //通過Id在格子裡新增物品 public void SetId(int id,int num = 1){ this.id = id; info = ObjectsInfo._instance.GetObjectInfoById (id); BagItem item = this.GetComponentInChildren<BagItem> (); item.SetIconName (info.icon_name); //更新顯示物品圖片 numLabel.enabled = true; this.num = num; numLabel.text = num.ToString (); } //新增物品數量加1 public void PlusNum(int num=1){ this.num += num; numLabel.text = this.num.ToString (); } //清空格子存的物品資訊 public void CleanrInfo(){ id = 0; info = null; num = 0; numLabel.enabled = false; } }
BagItem:管理物品拖拽功能及物品物品的更新顯示
Bagitem主要處理物品拖拽的功能及各種操作之後的物品圖片更新顯示
//繼承UIDragDropItem,實現UI可拖拽功能 public class BagItem : UIDragDropItem { private UISprite sprite; void Awake(){ base.Awake (); sprite = this.GetComponent<UISprite> (); } protected override void OnDragDropRelease(GameObject surface){ //每次UI拖拽結束後都會呼叫這個函式,surface表示拖拽後滑鼠下的物體 base.OnDragDropRelease (surface); if (surface != null) { //滑鼠下物體不為空,先判斷下滑鼠下的物體時什麼 if (surface.tag == Tags.bag_item_grid) { //拖放到空的格子裡面 if (surface == this.transform.parent.gameObject) { //拖放到自己的格子裡,位置歸零 } else { //拖放到一個空的格子裡 BagItemGrid oldparent = this.transform.parent.GetComponent<BagItemGrid>();//取得原有格子的資訊 this.transform.parent = surface.transform; //將其父親更改為新的空格子 ResetPosition (); BagItemGrid newparent = surface.GetComponent<BagItemGrid>(); //取得新的空格子 newparent.SetId (oldparent.id, oldparent.num); //將資訊存放到新的格子裡 oldparent.CleanrInfo (); //清除原來格子的資訊 } } else if (surface.tag == Tags.bag_item) { //拖放到有物體個格子裡 BagItemGrid Grid1 = this.transform.parent.GetComponent<BagItemGrid>(); //取得現在格子的資訊 BagItemGrid Grid2 = surface.transform.parent.GetComponent<BagItemGrid>(); //取得拖放到格子的資訊 int id = Grid1.id; //儲存原有格子的資訊 int num = Grid1.num; Grid1.SetId (Grid2.id, Grid2.num); //交換兩個格子的資訊 Grid2.SetId (id, num); } } ResetPosition (); } void ResetPosition(){ transform.localPosition = Vector3.zero; } public void SetId(int id){ ObjectInfo info = ObjectsInfo._instance.GetObjectInfoById (id); sprite.spriteName = info.icon_name; } public void SetIconName(string icon_name){ sprite.spriteName = icon_name; } }