新的背包系統包括:
1、一個用於表示背包系統的按鈕:
該按鈕上添加了EventListener事件,該事件經過改寫,可用於實現點擊一次展示,點擊第二次消失的效果。
代碼比較簡單,主要是在EventListener本身的事件代碼上進行了一定的修改:
public GameObject item;
public GameObject tip;
public int count = 0;
其中Item用於表示監聽的物體,tip表示受到監聽后發生動作的物體,count用於計數,以便於實現點擊兩次后tip物體消失的效果。
具體的點擊代碼如下所示,比較簡單,不再進行解釋:
void ButtonClick(GameObject button)
{
count++;
if(count==1)
tip.SetActive(true);
if (count == 2) {
tip.SetActive(false);
count = 0;
}
2、物品的顯示:
因為此處涉及到與后台端數據的傳輸,所以我在這里暫且先將物品的信息用一個TXT文件保存起來:
這些信息分別對應 物品的id 物品的名稱 物品的圖片表示 (暫且需要這么多,更多的信息以后豐富內容的時候進行添加)
為了讀取TXT文件中物品的信息,我們需要創建一個空物體,並在該物體上掛上讀取的腳本:
我們需要把TXT的文件讀取到一個String中,根據‘\n’和‘,’來分割字符串,取得相應的物品信息,保存到之后我們需要在點擊物品是顯示的Dictionary中去。
具體代碼如下,比較簡單:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class ObjectsInfo : MonoBehaviour
{
public static ObjectsInfo _instance;
public TextAsset objectsInfoListText;
private Dictionary<int, ObjectInfo> objectInfoDictionary =
new Dictionary<int, ObjectInfo>();
void Awake()
{
_instance = this;
ReadInfo();
}
public ObjectInfo GetObjectInfoById(int key)
{
ObjectInfo info = new ObjectInfo();
objectInfoDictionary.TryGetValue(key, out info);
return info;
}
private void ReadInfo()
{
string text = objectsInfoListText.text;
string[] strArray = text.Split('\n');
foreach (string str in strArray)
{
string[] proArray = str.Split(',');
ObjectInfo info = new ObjectInfo();
int id = int.Parse(proArray[0]);
string name = proArray[1];
string iconName = proArray[2];
string typeStr = proArray[3];
info.id = id;
info.name = name;
info.iconName = iconName;
//添加到字典上,id為key,方便根據id查找
objectInfoDictionary.Add(id, info);
}
}
}
//id,名稱,icon名稱,類型
public class ObjectInfo
{
public int id;
public string name;
public string iconName;
}
要讓背包內的物品正確顯示出來,還需要對物品添加一個SetId的方法,對於每個物品來說,id對應的圖片是不同的,最后進行使用時對應的效果也是不同的。
public void SetId(int id)
{
ObjectInfo info = ObjectsInfo._instance.GetObjectInfoById(id);
sprite.spriteName = info.iconName;
this.id = id;
}
除此之外,物品和其他不同,還需要相應拖拽事件,這里比較簡單,為物品添加一個 Box Collider,然后讓物品對應的腳本繼承於Unity原生的拖拽事件即可。
3、一個用於表示背包的Sprite:
加入一個Sprite,然后對Sprite進行圖片添加的操作。
此處需要注意的是,如果在NGUI中想要添加自己的圖片背景,和在Unity原生的添加是不一樣的。此處需要自己創建一個圖集Atlas。
點選你需要的圖片,點擊右鍵,選擇NGUI->Open Atlas Maker,會彈出以下對話框:
加入你需要的圖片后點擊畫面中的“添加/更新”按鈕即可。這樣可以被用於Sprite組件的屬於你自己的圖集就建立好了。之后只需要在對應的Sprite組件的 UI Sprite面板中,點擊Atlas,選擇圖集,在點擊Sprite,就可以了。
4、背包中的格子Cell:
首先分析一下,可以發現,背包需要一個Sprite,但背包中還有許多網格,所以在背包中創建一系列的Sprite,用於表示物品存放的格子。如圖中的Cell。
為了方便起見,這里可以將Cell進行Prefab的處理。
所謂的Prefab,就是將一個你自己定義好的資源打包,以便下次使用的時候,可以直接從資源文件里拖出來使用。有點類似於圖形學里的顯示列表(不知道這么比喻對不對)。
操作也非常簡單,對你需要進行Prefab處理的資源點擊右鍵,選擇Create -> Prefab即可。
因為背包系統中,背包本身面板需要存放一些Cell,也就格子,格子中再存放物體。所以對於背包面板來說,需要對格子Cell進行管理。需要創建一個List用於存放格子。為了方便格子的管理,最好在面板中給格子進行編號,如圖,從Cell01開始編號。
格子還需要對物體有一定的管理作用,在格子中定義變量id為物品的編號,num為物品的數量,添加一個Label用於在物品的右下角顯示該物品的數量。
using UnityEngine;
using System.Collections;
public class InventoryItemGrid : MonoBehaviour {
public int id = 0;
public int num = 0;
private ObjectInfo info = null;
private UILabel numLabel;
void Start()
{
numLabel = this.GetComponentInChildren<UILabel>();
}
public void SetId(int id, int num = 1)
{
this.id = id;
info = ObjectsInfo._instance.GetObjectInfoById(id);
InventoryItem item = this.GetComponentInChildren<InventoryItem>();
this.num = num;
numLabel.text = this.num.ToString();
numLabel.enabled = true;
item.SetId(id);
}
public void PlusNum(int num = 1)
{
this.num += num;
numLabel.text = this.num.ToString();
}
public void ClearInfo()
{
id = 0;
num = 0;
info = null;
numLabel.enabled = false;
}
}
至此我們對背包系統進行了拆分,分成了按鈕、物品、背包面板和格子幾部分。並初步實現了每一部分的功能,下面我們將要把這些分離開的功能整合到一起,實現一個完整的背包系統。