1. 程式人生 > >Unity3D自學筆記——UGUI揹包系統(三)物品彈出提示框

Unity3D自學筆記——UGUI揹包系統(三)物品彈出提示框

物品彈出提示框

效果圖

這裡寫圖片描述

這裡寫圖片描述

利用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);
    }
}