1. 程式人生 > >遊戲開發學習筆記(七)開發揹包系統

遊戲開發學習筆記(七)開發揹包系統

思路:

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;
	}

}