游戏开发学习笔记(七)开发背包系统

思路:

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

}


  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值