您的位置:首页 > 移动开发 > Unity3D

Unity3D自学笔记——UGUI背包系统(三)物品弹出提示框

2016-11-07 15:37 781 查看

物品弹出提示框

效果图





利用Toggle实现物品选中效果

向背包里层pnlGrid添加一个Toggle Group





修改Item预制体,将其修改为Toggle



向Item添加Toggle组件



默认Is On不选中

其余的设置不变,多了一个Checkmark,即IsOn为True时会显示该图片,所以设置一张图片。

预制体里不能设置Toggle的ToggleGroup,需要在代码里控制,修改UIItem脚本

public class UIItem : MonoBehaviour, IPointerClickHandler {
private Image m_Icon;
private Text m_TxtName;
private Text m_TxtCount;
private ItemEntity m_Item;
private Toggle m_Toggle;
private ToggleGroup m_ToggleGroup;

public event Action<ItemEntity> PointerClick;

void Awake()
{
this.m_Icon = UIHelper.FindChild<Image>(transform, "imgIcon");
this.m_TxtName = UIHelper.FindChild<Text>(transform, "imgName/Text");
this.m_TxtCount = UIHelper.FindChild<Text>(transform, "imgCount/Text");
this.m_Toggle = transform.GetComponent<Toggle>();
}

public void SetInfo(ItemEntity item)
{
this.m_Item = item;
this.m_TxtName.text = item.Name;
this.m_Icon.overrideSprite = Resources.Load<Sprite>(item.IconPath);
this.m_ToggleGroup = transform.parent.parent.GetComponent<ToggleGroup>();
this.m_Toggle.group = this.m_ToggleGroup;
//For Test
this.m_TxtCount.text = item.StackCount.ToString();
}

public void OnPointerClick(PointerEventData eventData)
{
if (PointerClick != null)
PointerClick(m_Item);
}
}


这里将控件都改为在Awake里获取了,界面赋值,不知道为什么老会丢失。

弹出界面





其他控件不描述了,其中在基础属性里面用了滚动效果,如果属性太多就会出现滚动条,可以进行滑动。

主要是Show方法,其余都是显示的判断拼接。

调用过程:

1.添加UIItem的时候,会将UIItem对应的ItemEntity存储到每一个UIItem中

2. UIInventory注册了UIItem的PointerClick事件,当UIItem被点击后,就会通知UIInventory,并把自己的ItemEntity传给UIInventory

3. 当UIInventory接到通知后,就会调用事件参数里的ItemEntity信息

public class UIItemToolTip : UIScene {

ec63
private Image m_Icon;
private Text m_NameText;
private Text m_LvText;
private Text m_TypeText;
private Text m_DescriptionText;
private Text m_AttributeText;
private Text m_BtnDressOnText;
private Text m_BtnDropText;

private UISceneWidget m_BtnClose;
private UISceneWidget m_BtnDressOn;
private UISceneWidget m_BtnDrop;
private ItemEntity m_Item;

void Awake()
{
this.m_Icon = UIHelper.FindChild<Image>(transform, "imgIcon/Image");
this.m_NameText = UIHelper.FindChild<Text>(transform, "txtName");
this.m_LvText = UIHelper.FindChild<Text>(transform, "txtLv");
this.m_TypeText = UIHelper.FindChild<Text>(transform, "txtType");
this.m_DescriptionText = UIHelper.FindChild<Text>(transform, "txtDescription");
this.m_AttributeText = UIHelper.FindChild<Text>(transform, "imgAttribute/txtAttribute");
this.m_BtnDressOnText = UIHelper.FindChild<Text>(transform, "btnDressOn/Text");
this.m_BtnDropText = UIHelper.FindChild<Text>(transform, "btnDrop/Text");
}

protected override void Start()
{
base.Start();
m_BtnClose = this.GetWidget("btnClose");
if(m_BtnClose != null)
m_BtnClose.PointerClick += BtnClosePointerClick;
m_BtnDressOn = this.GetWidget("btnDressOn");
if(m_BtnDressOn != null)
m_BtnDressOn.PointerClick += BtnDressOnPointerClick;
m_BtnDrop = this.GetWidget("btnDrop");
if(m_BtnDrop != null)
m_BtnDrop.PointerClick += BtnDropPointerClick;
}

public void Show(ItemEntity item, bool isLeft)
{
this.SetVisible(true);
this.m_Item = item;
this.m_Icon.overrideSprite = Resources.Load<Sprite>(item.IconPath);
this.m_NameText.text = item.Name;
this.m_DescriptionText.text = item.Description;
this.m_LvText.text = string.Format("等级: {0}", item.Lv);
this.m_TypeText.text = GetTypeString(item.ItemType);
this.m_AttributeText.text = GetAttributeString(item);
this.m_BtnDressOnText.text = GetButtonDressonText(item);
this.m_BtnDropText.text = "丢弃";
Vector3 pos = transform.localPosition;

if (isLeft)
{
transform.localPosition = new Vector3(-Mathf.Abs(pos.x), pos.y, pos.z);
}
else
{
transform.localPosition = new Vector3(Mathf.Abs(pos.x), pos.y, pos.z);
}
}

private void BtnClosePointerClick(PointerEventData obj)
{
this.SetVisible(false);
}

private void BtnDropPointerClick(PointerEventData obj)
{

}

private void BtnDressOnPointerClick(PointerEventData obj)
{

}

private string GetTypeString(ItemType type)
{
string typeString = "类型: {0}";
switch (type)
{
case ItemType.Potion:
typeString = string.Format(typeString, "");
break;
case ItemType.Armor:
typeString = string.Format(typeString, "防具");
break;
case ItemType.Necklace:
typeString = string.Format(typeString, "项链");
break;
case ItemType.Ring:
typeString = string.Format(typeString, "戒指");
break;
case ItemType.Weapon:
typeString = string.Format(typeString, "武器");
break;
}

return typeString;
}

private string GetAttributeString(ItemEntity item)
{
StringBuilder sbAttribute = new StringBuilder();
if(item.Hp != 0)
{
sbAttribute.AppendLine("体力 +" + item.Hp);
}
if(item.Mp != 0)
{
sbAttribute.AppendLine("魔力 +" + item.Mp);
}
if(item.Atk != 0)
{
sbAttribute.AppendLine("攻击 +" + item.Atk);
}
if(item.Def != 0)
{
sbAttribute.AppendLine("防御 +" + item.Def);
}
if(item.Spd != 0)
{
sbAttribute.AppendLine("速度 +" + item.Spd);
}
if(item.AtkRange != 0)
{
sbAttribute.AppendLine("攻击范围 +" + item.AtkRange);
}
if(item.AtkSpd != 0)
{
sbAttribute.AppendLine("攻击速度 +" + item.AtkSpd);
}
if(item.CriticalRate != 0)
{
sbAttribute.AppendFormat("暴击率 +" + item.CriticalRate);
}

return sbAttribute.ToString();
}

private string GetButtonDressonText(ItemEntity item)
{
string result = string.Empty;
switch (item.ItemType)
{
case ItemType.Armor:
case ItemType.Weapon:
case ItemType.Ring:
case ItemType.Necklace:
result = "装备";
break;
case ItemType.Potion:
result = "使用";
break;
}
return result;
}
}


UIInventory

public class UIInventory : UIScene {
public static int gridCount = 40; //背包格子数量

private GameObject m_GridPrefab; //格子预制体
private GameObject m_ItemPrefab; //物品预制体
private Transform m_PnlGrid; //背包里层
private RectTransform m_PnlGridRectTransfom; //背包里层的RectTransform,用于动态调整它的大小
private List<Transform> m_GridList = new List<Transform>(); //所有格子
private Dictionary<int, IEntity> m_ItemList; //从缓存里取出的ItemList
private UIItemToolTip m_EquipToolTip;

protected override void Start()
{
base.Start();
InitWidget();
InitGrid();
LoadData();
}

protected override void Update()
{
base.Update();
//For Test 随机从物品中取一个物品出来,目前物品只有2个
if (Input.GetMouseButtonDown(1))
{
int[] temp = new int[m_ItemList.Count];
for (int i = 0; i < m_ItemList.Count; i++)
{
temp[i] = m_ItemList.ToList()[i].Key;
}
int rd = Random.Range(0, m_ItemList.Count);
AddItem(temp[rd]);
}
}

private void InitWidget()
{
this.m_GridPrefab = (GameObject)Resources.Load("Inventory/Grid");
this.m_ItemPrefab = (GameObject)Resources.Load("Inventory/Item");
this.m_PnlGrid = this.transform.Find("pnlScrowView/pnlGrid");
this.m_PnlGridRectTransfom = m_PnlGrid.GetComponent<RectTransform>();
this.m_EquipToolTip = UIManager.Instance.GetUI<UIItemToolTip>(UIName.UIItemToolTip);
}

private void InitGrid()
{
//动态创建Grid
for (int i = 0; i < gridCount; i++)
{
GameObject grid = GameObject.Instantiate(this.m_GridPrefab);
grid.transform.SetParent(m_PnlGrid);
m_GridList.Add(grid.transform);
}
}

private void LoadData()
{
m_ItemList = PhotonDataCache.GetAll(PhotonCacheType.ItemList);
}

public Transform GetEnmptyGrid()
{
return m_GridList.Find(x => x.childCount == 0);
}

public void AddItem(int id)
{
Transform grid = GetEnmptyGrid();
if (grid == null)
return;
if (!m_ItemList.ContainsKey(id))
return;

ItemEntity item = m_ItemList[id] as ItemEntity;
GameObject go = GameObject.Instantiate(this.m_ItemPrefab);
go.transform.SetParent(grid);
go.GetComponent<UIItem>().SetInfo(item);
go.transform.localPosition = Vector3.zero;
go.transform.localScale = Vector3.one;
go.GetComponent<UIItem>().PointerClick += OnUIItemPointerClick;
}

private void OnUIItemPointerClick(ItemEntity item)
{
m_EquipToolTip.Show(item, true);
}
}


考虑到大家都在找我要源代码,目前已将源码上传至百度云,又需要的自行下载

http://pan.baidu.com/s/1dF1VT4X
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: