思路:
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;
}
}