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

88 lines
2.7 KiB
C#
Raw Normal View History

2023-08-27 02:58:19 +08:00
using System;
2023-06-08 14:09:50 +08:00
using System.Collections;
2023-08-27 02:58:19 +08:00
using System.Collections.Concurrent;
2023-06-08 14:09:50 +08:00
using System.Collections.Generic;
2023-10-20 19:31:12 +08:00
using BITFALL.Entities.Equipment;
2023-06-08 14:09:50 +08:00
using UnityEngine;
using BITKit;
using BITKit.Entities;
2023-08-27 02:58:19 +08:00
using BITKit.Entities.Player;
2023-06-08 14:09:50 +08:00
using BITKit.UX;
using RotaryHeart.Lib.SerializableDictionary;
2023-08-27 02:58:19 +08:00
using UnityEngine.Playables;
using UnityEngine.UIElements;
2023-06-08 14:09:50 +08:00
namespace BITFALL
{
2023-09-01 14:33:54 +08:00
public class UXEquipSelector : MonoBehaviour
2023-06-08 14:09:50 +08:00
{
2023-08-27 02:58:19 +08:00
[SerializeReference,SubclassSelector] private IPlayerService playerService;
2023-06-08 14:09:50 +08:00
[SerializeField]
private SerializableDictionaryBase<int, UXImage> dictionary = new();
[SerializeField] private UXImage currentUXEquip;
2023-08-27 02:58:19 +08:00
private readonly ConcurrentDictionary<int,IBasicItem> cache=new();
2023-09-01 14:33:54 +08:00
2023-10-20 19:31:12 +08:00
[Inject]
2023-09-01 14:33:54 +08:00
private IPlayerEquipSelector _equipSelector;
2023-10-20 19:31:12 +08:00
[Inject]
private IEntityEquipment _entityEquipment;
2023-06-08 14:09:50 +08:00
public void OnEquip(IBasicItem item)
{
2023-09-01 14:33:54 +08:00
if(item is null) return;
2023-06-08 14:09:50 +08:00
var assets = item.GetAssetable();
currentUXEquip.SetTexture(assets.RectangleIcon);
}
2023-10-29 15:27:13 +08:00
public void OnUnEquip(IBasicItem item)
2023-06-08 14:09:50 +08:00
{
currentUXEquip.SetTexture(null);
}
2023-08-23 01:59:40 +08:00
public void OnUpdateEquip(IDictionary<int, IBasicItem> maps)
2023-06-08 14:09:50 +08:00
{
2023-08-27 02:58:19 +08:00
cache.Clear();
2023-09-01 14:33:54 +08:00
foreach (var (key, image) in dictionary)
2023-06-08 14:09:50 +08:00
{
2023-09-01 14:33:54 +08:00
if (maps.TryGetValue(key, out var item))
2023-06-08 14:09:50 +08:00
{
var asset = item.GetAssetable();
image.SetTexture(asset.RectangleIcon);
}
else
{
image.SetTexture(null);
}
2023-09-01 14:33:54 +08:00
cache.TryAdd(key, item);
2023-06-08 14:09:50 +08:00
}
}
private void Start()
{
2023-08-27 02:58:19 +08:00
playerService.OnPlayerInitialized += OnStartLocalPlayer;
2023-10-29 15:27:13 +08:00
OnUnEquip(null);
2023-09-01 14:33:54 +08:00
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);
}
});
}
2023-06-08 14:09:50 +08:00
}
2023-08-27 02:58:19 +08:00
private void OnDestroy()
{
playerService.OnPlayerInitialized -= OnStartLocalPlayer;
}
2023-10-30 01:25:53 +08:00
private void OnStartLocalPlayer(IUnityEntity unityEntity)
2023-06-08 14:09:50 +08:00
{
2023-10-20 19:31:12 +08:00
cache.Clear();
2023-10-30 01:25:53 +08:00
unityEntity.Inject(this);
2023-10-20 19:31:12 +08:00
_entityEquipment.OnEquip += OnEquip;
2023-10-29 15:27:13 +08:00
_entityEquipment.OnUnEquip += OnUnEquip;
2023-09-01 14:33:54 +08:00
_equipSelector.OnUpdateEquip += OnUpdateEquip;
2023-06-08 14:09:50 +08:00
}
}
}