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

考虑到大家都在找我要源代码,目前已将源码上传至百度云,又需要的自行下载
http://pan.baidu.com/s/1dF1VT4X

  • 7
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值