using Cysharp.Threading.Tasks; using SepCore.AsyncTask; using SepCore.Event; using UnityEngine; using UnityEngine.UI; namespace SepCore.UI { public class DisplayItem : MonoBehaviour { [SerializeField] private IconArea _iconArea; [SerializeField] private RectTransform _itemRect; [SerializeField] private CommonButton _button; private DisplayItemContext _context; private int _index = -1; private bool _listenersBound; public async UniTaskVoid OnInit(DisplayItemContext context, int index) { EnsureListeners(); _context = context; _index = index; var sprite = await SpriteLoader.LoadSpriteByKeyAsync(_context.IconAssetName); _iconArea.OnInit(sprite, _context.Rarity); } public void OnReset() { _context = null; _index = -1; _iconArea.OnReset(); } private void EnsureListeners() { if (_listenersBound) { return; } _listenersBound = true; CommonButton button = GetComponent(); button.onClick.AddListener(OnItemInfoLock); button.RegisterPointerEnterAction(OnItemInfoShow); button.RegisterPointerExitAction(OnItemInfoHide); } private void OnItemInfoShow() { if (_index < 0) return; Rect rect = _itemRect.rect; Vector3 targetPos = _itemRect.TransformPoint(new Vector3( (rect.xMin + rect.xMax) / 2, rect.yMax, 0f) ); GameEntry.Event.Fire(this, DisplayItemHoverEventArgs.Create(_index, _context.IsWeapon, targetPos)); } private void OnItemInfoLock() { GameEntry.Event.Fire(this, DisplayItemLockEventArgs.Create()); } private void OnItemInfoHide() { GameEntry.Event.Fire(this, DisplayItemHideEventArgs.Create()); } } }