Files
Net.Like.Xue.Tokyo/Packages-Local/Com.Project.B.Unity/UX/UXSurvival.cs
2025-06-24 23:49:13 +08:00

75 lines
2.3 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using BITKit;
using BITKit.UX;
using Net.Project.B.Buff;
using Net.Project.B.UX;
using Project.B.Entities;
using UnityEngine;
using UnityEngine.UIElements;
namespace Net.Project.B
{
public class UXSurvival<TPanel> : UIToolkitSubPanel<TPanel>,IDisposable, IUXSurvival where TPanel : IUXPanel
{
private readonly ITicker _ticker;
private readonly IPlayerFactory _playerFactory;
[UXBindPath("survival-container")]
private VisualElement _survivalContainer;
private VisualTreeAsset _template;
private readonly Dictionary<int, ProgressBar> _dictionary = new();
public UXSurvival(IServiceProvider serviceProvider, IPlayerFactory playerFactory, ITicker ticker) : base(serviceProvider)
{
_playerFactory = playerFactory;
_ticker = ticker;
_ticker.Add(Tick);
}
protected override void OnInitiated()
{
base.OnInitiated();
_template = _survivalContainer.Q<TemplateContainer>().templateSource;
_survivalContainer.Clear();
foreach (var buff in SurvivalBuffs)
{
var container = _survivalContainer.Create(_template);
container.Get<Label>().text = buff.GetType().Name;
_dictionary[buff.GetType().GetHashCode()] = container.Get<ProgressBar>();
}
}
public void Dispose()
{
_ticker.Remove(Tick);
}
private void Tick(float obj)
{
foreach (var entity in _playerFactory.Entities.Values)
{
entity.ServiceProvider.QueryComponents(out IBuffComponent buffComponent);
var buffers = buffComponent.Buffs.Span;
for (var i = 0; i < buffers.Length; i++)
{
ref var buff =ref buffers[i];
if (_dictionary.TryGetValue(buff.GetType().GetHashCode(), out var ve))
{
ve.value = buff.Value;
}
}
break;
}
}
public IReadOnlyCollection<IBuff> SurvivalBuffs { get; set; }=ArraySegment<IBuff>.Empty;
}
}