From f6e0b24d815dec6dbb355f296eaf50a28fd6eb90 Mon Sep 17 00:00:00 2001 From: Vova <3emaster@gmail.com> Date: Mon, 18 Dec 2023 10:50:05 +0200 Subject: [PATCH] Fix issue with UI container update --- .../Items/ContainerItem.cs | 18 ++++++- Assets/Scripts/Player/Player.cs | 17 +++++-- Assets/Scripts/UIElements/ContainerItemsUI.cs | 51 +++++++++++-------- 3 files changed, 58 insertions(+), 28 deletions(-) diff --git a/Assets/Scripts/InteractableObjects/Items/ContainerItem.cs b/Assets/Scripts/InteractableObjects/Items/ContainerItem.cs index 5c803562..cf90faa6 100644 --- a/Assets/Scripts/InteractableObjects/Items/ContainerItem.cs +++ b/Assets/Scripts/InteractableObjects/Items/ContainerItem.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using UnityEngine; @@ -6,7 +7,7 @@ public class ContainerItem : MonoBehaviour { [SerializeField] private ContainerSO _containerSO; - + public event EventHandler OnItemsChange; private List _items = new List(); @@ -21,12 +22,27 @@ public class ContainerItem : MonoBehaviour { Debug.Log($"Player put to container a {item.ItemName}"); _items.Add(item); + OnItemsChange?.Invoke(this,EventArgs.Empty); } else { Debug.Log("Container is full"); } } + + public void Remove(BaseItemSO item) + { + if (_items.Count>0) + { + Debug.Log($"Player remove {item.ItemName} from container"); + _items.Remove(item); + OnItemsChange?.Invoke(this, EventArgs.Empty); + } + else + { + Debug.Log("Container is emplty"); + } + } public List GetItems() { diff --git a/Assets/Scripts/Player/Player.cs b/Assets/Scripts/Player/Player.cs index 22240874..d8480018 100644 --- a/Assets/Scripts/Player/Player.cs +++ b/Assets/Scripts/Player/Player.cs @@ -1,9 +1,11 @@ using Assets.Scripts.Interfaces; +using System; using System.Collections.Generic; using UnityEngine; public class Player : BaseCharacter { + public event EventHandler OnContainerChanged; public static Player Instance { get; private set; } [SerializeField] @@ -118,16 +120,21 @@ public class Player : BaseCharacter containerItem.transform.parent = _holdPoint; containerItem.transform.localPosition = Vector3.zero; _containerItem = containerItem; + OnContainerChanged.Invoke(this,true); } + + public void ClearContainerItem() + { + OnContainerChanged.Invoke(this, false); + Destroy(_containerItem.gameObject); + _containerItem = null; + } + public ContainerItem GetContainerItem() { return _containerItem; } - public void ClearContainerItem() - { - Destroy(_containerItem.gameObject); - _containerItem = null; - } + public bool IsHoldContainerItem() { return _containerItem != null; diff --git a/Assets/Scripts/UIElements/ContainerItemsUI.cs b/Assets/Scripts/UIElements/ContainerItemsUI.cs index 6a5e4217..2c8944e6 100644 --- a/Assets/Scripts/UIElements/ContainerItemsUI.cs +++ b/Assets/Scripts/UIElements/ContainerItemsUI.cs @@ -10,40 +10,47 @@ public class ContainerItemsUI : MonoBehaviour [SerializeField] private Transform _itemUITemplate; + private ContainerItem _playerContainer; + private void Awake() { _container.gameObject.SetActive(false); } - private void Update() + private void Start() { - if (Player.Instance.IsHoldContainerItem()) + Player.Instance.OnContainerChanged += OnContainerChanged; + } + + private void OnContainerChanged(object sender, bool e) + { + if (e) { - var playerContainer = Player.Instance.GetContainerItem(); _container.gameObject.SetActive(true); - - if (playerContainer.IsSalebleItems()) - { - ClearObject(); - - var playerItemsList = playerContainer.GetItems(); - for (int count = 0; count < playerItemsList.Count; count++) - { - var itemUI = Instantiate(_itemUITemplate, _itemsList); - itemUI.gameObject.SetActive(true); - itemUI.GetComponent().SetItem((SellableItemSO)playerItemsList[count]); - } - } - else - { - ClearObject(); - _container.gameObject.SetActive(false); - } + _playerContainer = Player.Instance.GetContainerItem(); + _playerContainer.OnItemsChange += OnItemsChange; } else { - ClearObject(); _container.gameObject.SetActive(false); + _playerContainer.OnItemsChange -= OnItemsChange; + _playerContainer = null; + } + } + + private void OnItemsChange(object sender, System.EventArgs e) + { + if (_playerContainer.IsSalebleItems()) + { + ClearObject(); + + var playerItemsList = _playerContainer.GetItems(); + for (int count = 0; count < playerItemsList.Count; count++) + { + var itemUI = Instantiate(_itemUITemplate, _itemsList); + itemUI.gameObject.SetActive(true); + itemUI.GetComponent().SetItem((SellableItemSO)playerItemsList[count]); + } } }