BITFALL/Assets/Artists/Scripts/UX/UXEquipSelector.cs

76 lines
2.2 KiB
C#

using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using BITFALL.Entities.Equipment;
using UnityEngine;
using BITKit;
using BITKit.Entities;
using BITKit.Entities.Player;
using BITKit.UX;
using UnityEngine.Playables;
using UnityEngine.UIElements;
using AYellowpaper.SerializedCollections;
namespace BITFALL
{
public class UXEquipSelector : MonoBehaviour
{
[Header(Constant.Header.Components)]
[SerializeField] private SerializedDictionary<int, UXImage> dictionary = new();
[Header(Constant.Header.Services)]
[SerializeReference,SubclassSelector]
private IPlayerService playerService;
private readonly ConcurrentDictionary<int,IBasicItem> cache=new();
[Inject]
private IPlayerEquipSelector _equipSelector;
private void Start()
{
playerService.OnPlayerInitialized += OnStartLocalPlayer;
foreach (var x in dictionary)
{
x.Value.visualElement.RegisterCallback<MouseDownEvent>(evt =>
{
if (evt.button is not 1) return;
if (cache.TryGetValue(x.Key, out var item))
{
_equipSelector.TryDeEquip(item);
}
});
}
}
private void OnDestroy()
{
playerService.OnPlayerInitialized -= OnStartLocalPlayer;
}
public void OnUpdateEquip(IDictionary<int, IBasicItem> maps)
{
cache.Clear();
foreach (var (key, image) in dictionary)
{
if (maps.TryGetValue(key, out var item))
{
var asset = item.GetAssetable();
image.SetTexture(asset.RectangleIcon);
}
else
{
image.SetTexture(null);
}
cache.TryAdd(key, item);
}
}
private void OnStartLocalPlayer(IUnityEntity unityEntity)
{
cache.Clear();
unityEntity.Inject(this);
_equipSelector.OnUpdateEquip += OnUpdateEquip;
}
}
}