diff options
Diffstat (limited to 'SurvivalTest/Assets/Scripts/UI/Panel/PanelItemBar')
-rw-r--r-- | SurvivalTest/Assets/Scripts/UI/Panel/PanelItemBar/ItemWidget.cs | 118 | ||||
-rw-r--r-- | SurvivalTest/Assets/Scripts/UI/Panel/PanelItemBar/PanelItemBar.cs | 70 |
2 files changed, 182 insertions, 6 deletions
diff --git a/SurvivalTest/Assets/Scripts/UI/Panel/PanelItemBar/ItemWidget.cs b/SurvivalTest/Assets/Scripts/UI/Panel/PanelItemBar/ItemWidget.cs index 55898f2..552672a 100644 --- a/SurvivalTest/Assets/Scripts/UI/Panel/PanelItemBar/ItemWidget.cs +++ b/SurvivalTest/Assets/Scripts/UI/Panel/PanelItemBar/ItemWidget.cs @@ -1,9 +1,123 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; +using UnityEngine.UI; -public class ItemWidget : MonoBehaviour +public struct ItemWidgetParam { - + // 主动点击 + public System.Action<ItemWidget> onSelected; + public ItemBase item; +} + +public class ItemWidget : UIGridItemBase +{ + public Image Image_Icon; + public Image Image_SelectBg; + + public Image Image_Use; + + private System.Action<ItemWidget> onSelected; + + public ItemBase item { get { return m_Item; } } + private ItemBase m_Item; + + private Coroutine m_CoUse; + + private int m_PendingUse = 0; + + public void SetSelectBg(bool selected) + { + Image_SelectBg.gameObject.SetActive(selected); + } + + public override void Set(object param) + { + ItemWidgetParam info = (ItemWidgetParam)param; + onSelected = info.onSelected; + m_Item = info.item; + + Image_Icon.sprite = ResourceManager.Instance.Load<Sprite>(info.item.iconPath); + + SetSelectBg(false); + + Image_Use.gameObject.SetActive(false); + } + + public void OnSelectCallback() + { + SetSelectBg(true); + } + + public void OnDeselectCallback() + { + SetSelectBg(false); + } + + public void OnUseCallback() + { + m_PendingUse++; + PlayUseAnimation(); + } + + private void PlayUseAnimation() + { + if (m_CoUse != null) + return; + Image_Use.gameObject.SetActive(true); + m_CoUse = StartCoroutine(CoUseAnimation()); + } + + IEnumerator CoUseAnimation() + { + float speed = 5f; + + while(m_PendingUse > 0) + { + Image_Use.fillOrigin = (int)Image.OriginVertical.Bottom; + float t = 0; + while (true) + { + t += speed * Time.deltaTime; + + if (t > 1) + break; + + Image_Use.fillAmount = Mathf.Lerp(0, 1, t); + + yield return null; + } + + Image_Use.fillOrigin = (int)Image.OriginVertical.Top; + t = 0; + while (true) + { + t += speed * Time.deltaTime; + + if (t > 1) + break; + + Image_Use.fillAmount = Mathf.Lerp(1, 0, t); + + yield return null; + } + m_PendingUse--; + } + + Image_Use.gameObject.SetActive(false); + + m_CoUse = null; + + yield break; + } + + private void StopUseAnimation() + { + if (m_CoUse != null) + { + StopCoroutine(m_CoUse); + } + Image_Use.gameObject.SetActive(false); + } } diff --git a/SurvivalTest/Assets/Scripts/UI/Panel/PanelItemBar/PanelItemBar.cs b/SurvivalTest/Assets/Scripts/UI/Panel/PanelItemBar/PanelItemBar.cs index 00acafc..74f90c3 100644 --- a/SurvivalTest/Assets/Scripts/UI/Panel/PanelItemBar/PanelItemBar.cs +++ b/SurvivalTest/Assets/Scripts/UI/Panel/PanelItemBar/PanelItemBar.cs @@ -1,13 +1,31 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; +using UnityEngine.UI; public class PanelItemBar : PanelBase { - /// <summary> - /// 当前持有的Items - /// </summary> - public List<ItemWidget> m_Items = new List<ItemWidget>(); + public ItemWidget m_ItemTempalte; + + public UISimpleGrid m_ItemGrid; + + public Text m_TextName; + + // 当前持有的Items + private List<ItemWidget> m_Items = new List<ItemWidget>(); + + private int m_CurrentIndex = 0; + + public override void Set(object param) + { + for(int i = 0; i < PlayerManager.Instance.items.Count; ++i) + { + ItemWidget widget = MakeItemWidget(PlayerManager.Instance.items[i]); + m_Items.Add(widget); + } + + SelectItemWidget(0); + } bool SwitchToLeft() { @@ -19,14 +37,58 @@ public class PanelItemBar : PanelBase return Input.GetButtonDown("RightItem"); } + bool UseItem() + { + return Input.GetButtonDown("Fire3"); + } + + ItemWidget MakeItemWidget(ItemBase item) + { + ItemWidget widget = Instantiate<ItemWidget>(m_ItemTempalte); + widget.transform.SetParent(m_ItemGrid.transform); + widget.gameObject.SetActive(true); + widget.GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0); + + ItemWidgetParam param = new ItemWidgetParam(); + //param.onSelected = OnSelectItemWidget; + param.item = item; + widget.Set(param); + return widget; + } + protected override void Update() { if (SwitchToLeft()) { + int newIndex = Mathf.Clamp(m_CurrentIndex - 1, 0, m_Items.Count - 1); + SelectItemWidget(newIndex); } if (SwitchToRight()) { + int newIndex = Mathf.Clamp(m_CurrentIndex + 1, 0, m_Items.Count - 1); + SelectItemWidget(newIndex); } + if (UseItem()) + { + m_Items[m_CurrentIndex].OnUseCallback(); + PlayerManager.Instance.UseCurrentItem(); + } + } + + void SelectItemWidget(int index) + { + if(index < 0 || index > m_Items.Count - 1) + { + return ; + } + m_Items[m_CurrentIndex].OnDeselectCallback(); + m_Items[index].OnSelectCallback(); + + m_TextName.text = m_Items[index].item.name; + + m_CurrentIndex = index; + + PlayerManager.Instance.SetCurrentItem(m_Items[index].item); } } |