Unity3D自學筆記——UGUI揹包系統(三)物品彈出提示框
阿新 • • 發佈:2019-01-05
物品彈出提示框
效果圖
利用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 {
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);
}
}