背包系统基本功能:添加物品、删除物品、拖拽物品、交换物品位置、排列物品等等。
首先在unity将背包的UI界面制作完成,如图:
Text是用来显示当前格子物品的数量。
然后将需要生成的物品UI制作成预制物,如图所示:
接下来上代码
1、添加物品
添加物品的时候需要注意的是(1)当前格子是否为空(2)当前格子是否有跟需要添加相同的物体(3)格子为空的时候需要按照空格子的顺序添加物体(4)当前格子有需要添加的物体时,只需要数量++
///
/// 添加物品
///
///
void LoadObjs(int objnum)
{
switch (objnum)
{
case 101: //red
GameObject objred = GameObject.Find("red");
if (objred != null)
{
int num = int.Parse(objred.transform.parent.GetChild(0).GetComponent().text);
num++;
objred.transform.parent.GetChild(0).GetComponent().text = num.ToString();
return;
}
for (int i = 0; i < bagBakcGround.transform.childCount; i++)
{
if (bagBakcGround.transform.GetChild(i).childCount <= 1) //格子为空 创建新物体
{
GameObject go = Instantiate(Resources.Load("objs/red"));
go.transform.parent = bagBakcGround.transform.GetChild(i);
go.transform.localPosition = new Vector3(0, 0, 0);
go.transform.name = "red";
bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text = "1";
break;
}
//else //格子不为空 添加物体数量
//{
// if (bagBakcGround.transform.GetChild(i).GetChild(1).name == "red")
// {
// int num = int.Parse(bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text);
// num++;
// bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text = num.ToString();
// return;
// }
//}
}
break;
case 102: //yellow
GameObject objyellow = GameObject.Find("yellow");
if (objyellow != null)
{
int num = int.Parse(objyellow.transform.parent.GetChild(0).GetComponent().text);
num++;
objyellow.transform.parent.GetChild(0).GetComponent().text = num.ToString();
return;
}
for (int i = 0; i < bagBakcGround.transform.childCount; i++)
{
if (bagBakcGround.transform.GetChild(i).childCount <= 1) //格子为空 创建新物体
{
GameObject go = Instantiate(Resources.Load("objs/yellow"));
go.transform.parent = bagBakcGround.transform.GetChild(i);
go.transform.localPosition = new Vector3(0, 0, 0);
go.transform.name = "yellow";
bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text = "1";
break;
}
//else //格子不为空 添加物体数量
//{
// if (bagBakcGround.transform.GetChild(i).GetChild(1).name == "yellow")
// {
// int num = int.Parse(bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text);
// num++;
// bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text = num.ToString();
// return;
// }
//}
}
break;
case 103: //black
GameObject objblack = GameObject.Find("black");
if (objblack != null)
{
int num = int.Parse(objblack.transform.parent.GetChild(0).GetComponent().text);
num++;
objblack.transform.parent.GetChild(0).GetComponent().text = num.ToString();
return;
}
for (int i = 0; i < bagBakcGround.transform.childCount; i++)
{
if (bagBakcGround.transform.GetChild(i).childCount <= 1) //格子为空 创建新物体
{
GameObject go = Instantiate(Resources.Load("objs/black"));
go.transform.parent = bagBakcGround.transform.GetChild(i);
go.transform.localPosition = new Vector3(0, 0, 0);
go.transform.name = "black";
bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text = "1";
break;
}
//else //格子不为空 添加物体数量
//{
// if (bagBakcGround.transform.GetChild(i).GetChild(1).name == "black")
// {
// int num = int.Parse(bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text);
// num++;
// bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text = num.ToString();
// return;
// }
//}
}
break;
default:
break;
}
}
2、拖拽物品、删除物品、交换位置。
先上完整代码:
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class DragUI : MonoBehaviour,IDragHandler,IEndDragHandler
{
public Vector2 offsetPos;
public Transform partar;
///
/// 拖拽物品
///
///
public void OnDrag(PointerEventData eventData)
{
transform.parent = GameObject.Find("Canvas").gameObject.transform;
transform.position = eventData.position - offsetPos;
}
public void OnEndDrag(PointerEventData eventData)
{
//--------是否对格子物品进行丢弃------------
if(Mathf.Abs(Vector3.Distance(transform.position, transform.parent.position)) > 180)
{
int num = int.Parse(partar.GetChild(0).GetComponent().text);
num--;
if(num > 0)
{
partar.GetChild(0).GetComponent().text = num.ToString();
}
else if(num <= 0)
{
partar.GetChild(0).GetComponent().text = "";
Destroy(transform.gameObject);
return;
}
}
//---------格子物品交换-----------
for (int i = 0; i < bagUI.Instance.bagBakcGround.transform.childCount; i++)
{
if(bagUI.Instance.bagBakcGround.transform.GetChild(i).childCount > 1)
{
if(Mathf.Abs(Vector3.Distance(transform.position, bagUI.Instance.bagBakcGround.transform.GetChild(i).GetChild(1).position)) < 2.5f)
{
//----更换物品数量---
string targetNum = partar.GetChild(0).GetComponent().text;
string ChangNum = bagUI.Instance.bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text;
bagUI.Instance.bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text = targetNum;
partar.GetChild(0).GetComponent().text = ChangNum;
//----------更换物品---
bagUI.Instance.bagBakcGround.transform.GetChild(i).GetChild(1).GetComponent().partar = partar;
bagUI.Instance.bagBakcGround.transform.GetChild(i).GetChild(1).parent = partar;
partar.GetChild(1).localPosition = new Vector3(0, 0, 0);
transform.parent = bagUI.Instance.bagBakcGround.transform.GetChild(i);
transform.localPosition = new Vector3(0, 0, 0);
partar = transform.parent;
return;
}
}
else if(bagUI.Instance.bagBakcGround.transform.GetChild(i).childCount <= 1)
{
if(Mathf.Abs(Vector3.Distance(transform.position, bagUI.Instance.bagBakcGround.transform.GetChild(i).GetChild(0).position)) < 55.0f &&
Mathf.Abs(Vector3.Distance(transform.position, bagUI.Instance.bagBakcGround.transform.GetChild(i).GetChild(0).position)) > 25.0f)
{
string parNum = partar.GetChild(0).GetComponent().text;
partar.GetChild(0).GetComponent().text = "";
transform.parent = bagUI.Instance.bagBakcGround.transform.GetChild(i);
transform.localPosition = new Vector3(0, 0, 0);
partar = transform.parent;
partar.GetChild(0).GetComponent().text = parNum;
return;
}
}
}
transform.parent = partar;
transform.localPosition = new Vector3(0, 0, 0);
}
private void Start()
{
partar = transform.parent;
}
}
(1)拖拽物品
拖拽物体实现UnityEngine.EventSystems中的接口IDragHandler和IEndDragHandler
OnDrag中的transform.parent赋值是因为UI层级关系,拖拽UI到其他格子最上面,不能被层级关系遮挡。
partar是用来存放该物品UI的父物体,拖拽结束时需要返回到拖拽前的位置。
OnEndDrag结束时
(2)删除物品
删除物品是用当前物品的pos和格子pos通过求绝对值来判断时候已经将物品拖拽到背包界面外面来删除该物品;
如果该物品就一个,那么就直接删除物品,如果大于1那么就数量减减。
(3)交换位置
//---------格子物品交换-----------
for (int i = 0; i < bagUI.Instance.bagBakcGround.transform.childCount; i++)
{
if(bagUI.Instance.bagBakcGround.transform.GetChild(i).childCount > 1) //如果格子不为空
{
if(Mathf.Abs(Vector3.Distance(transform.position, bagUI.Instance.bagBakcGround.transform.GetChild(i).GetChild(1).position)) < 2.5f)
{
//----更换物品数量---
string targetNum = partar.GetChild(0).GetComponent().text;
string ChangNum = bagUI.Instance.bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text;
bagUI.Instance.bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text = targetNum;
partar.GetChild(0).GetComponent().text = ChangNum;
//----------更换物品---
bagUI.Instance.bagBakcGround.transform.GetChild(i).GetChild(1).GetComponent().partar = partar;
bagUI.Instance.bagBakcGround.transform.GetChild(i).GetChild(1).parent = partar;
partar.GetChild(1).localPosition = new Vector3(0, 0, 0);
transform.parent = bagUI.Instance.bagBakcGround.transform.GetChild(i);
transform.localPosition = new Vector3(0, 0, 0);
partar = transform.parent;
return;
}
}
else if(bagUI.Instance.bagBakcGround.transform.GetChild(i).childCount <= 1) //如果格子为空
{
if(Mathf.Abs(Vector3.Distance(transform.position, bagUI.Instance.bagBakcGround.transform.GetChild(i).GetChild(0).position)) < 55.0f &&
Mathf.Abs(Vector3.Distance(transform.position, bagUI.Instance.bagBakcGround.transform.GetChild(i).GetChild(0).position)) > 25.0f)
{
string parNum = partar.GetChild(0).GetComponent().text;
partar.GetChild(0).GetComponent().text = "";
transform.parent = bagUI.Instance.bagBakcGround.transform.GetChild(i);
transform.localPosition = new Vector3(0, 0, 0);
partar = transform.parent;
partar.GetChild(0).GetComponent().text = parNum;
return;
}
}
}
交换物品位置是需要考虑交换到目标的格子中是否为空。
3、排列背包物品
当背包中的物品排列杂乱无章,有的格子有物品,有的格子没有,这时就需要排列背包中的物品。
///
/// 整理背包
///
void FinishingBag()
{
Dictionary ObjNum = new Dictionary();
for (int i = 0; i < bagBakcGround.transform.childCount; i++)
{
if(bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text != "")
{
ObjNum.Add(bagBakcGround.transform.GetChild(i).GetChild(0), bagBakcGround.transform.GetChild(i).GetChild(1).gameObject);
}
}
List ObjKey = new List(ObjNum.Keys);
for (int i = 0; i < bagBakcGround.transform.childCount; i++)
{
if(bagBakcGround.transform.GetChild(i).childCount <= 1)
{
if(i < ObjNum.Count)
{
bagBakcGround.transform.GetChild(i).GetChild(0).GetComponent().text = ObjKey[i].GetComponent().text;
ObjNum[ObjKey[i]].transform.parent.GetChild(0).GetComponent().text = "";
ObjNum[ObjKey[i]].transform.parent = bagBakcGround.transform.GetChild(i);
ObjNum[ObjKey[i]].transform.GetComponent().partar = bagBakcGround.transform.GetChild(i);
bagBakcGround.transform.GetChild(i).GetChild(1).localPosition = new Vector3(0, 0, 0);
}
}
}
}
效果图如下: