This commit is contained in:
CortexCore
2024-03-29 00:58:24 +08:00
parent 967ad8eacf
commit 05315ef4a8
232 changed files with 53368 additions and 8539 deletions

View File

@@ -27,7 +27,7 @@ namespace BITKit.Entities.Player.Character
private readonly List<Renderer> fpvRenderer = new();
private readonly List<Renderer> tpvRenderer = new();
private readonly List<Renderer> fpvOverrideRenderers = new();
private readonly List<Renderer> tpvRendererGroup = new();
private readonly List<Renderer> tpvOverrideRenderers = new();
[Header(Constant.Header.Reference)]
[SerializeReference, SubclassSelector] public IReference getDamage;
@@ -44,29 +44,31 @@ namespace BITKit.Entities.Player.Character
[Inject(true)] private IEntityMovement _movement;
private Renderer[] _tpvRendererGroup;
private readonly ValidHandle allowFPVOverride = new();
private readonly IntervalUpdate _freezeInterval=new (0.01f);
private bool _isDirty;
private bool _lock;
private void OnCosmeticsChange()
{
_lock = true;
}
public override void OnAwake()
{
base.OnAwake();
if(cosmeticService is not null)
cosmeticService.OnCosmeticsChanged += Rebuild;
}
public override void OnStart()
{
if (cosmeticService is not null)
{
cosmeticService.OnCosmeticsChange += OnCosmeticsChange;
cosmeticService.OnCosmeticsChanged += OnCosmeticsChanged;
}
if (_health is not null)
{
_health.OnSetAlive += _ => UpdateMeshState();
_health.OnSetAlive += SetDirty;
_health.OnDamageRelease += OnDamageRelease;
}
if (_cameraService is not null)
_cameraService.OnCameraActivated += _ => UpdateMeshState();
_cameraService.OnCameraActivated += SetDirty;
if (_entityOverride is not null)
_entityOverride.OnOverride += _ =>
@@ -74,7 +76,8 @@ namespace BITKit.Entities.Player.Character
UpdateMeshState();
allowFPVOverride.SetElements(_entityOverride, _);
};
_tpvRendererGroup = tpvRendererGroup.SelectMany(x => x.GetComponentsInChildren<Renderer>(true)).ToArray();
if (_equipment is not null)
{
@@ -108,31 +111,38 @@ namespace BITKit.Entities.Player.Character
{
foreach (var x in fpvOverrideRenderers)
{
x.enabled = value;
try
{
x.enabled = value;
}
catch (Exception e)
{
BIT4Log.LogException(e);
}
}
});
// if (_equipment is not null)
// allowFPVOverride.AddElement(_equipment);
Rebuild();
}
public override void OnPlayerInitialized()
public override void OnDestroyComponent()
{
base.OnDestroyComponent();
if (cosmeticService is null) return;
cosmeticService.OnCosmeticsChange -= OnCosmeticsChange;
cosmeticService.OnCosmeticsChanged -= OnCosmeticsChanged;
}
public override void OnUpdate(float deltaTime)
{
if (!_isDirty || _lock || !_freezeInterval.AllowUpdateWithoutReset) return;
_isDirty = false;
UpdateMeshState();
}
public override void OnPlayerDispose()
{
SetFPV(false);
}
// private void OnSetHP(int hp)
// {
// UnityEntity.Invoke<string>(Constant.Animation.Play, getDamage.Value);
// }
private void OnDamageRelease(DamageMessage damageMessage)
{
UnityEntity.Invoke<string>(Constant.Animation.Play, getDamage.Value);
if (getDamage is not null)
UnityEntity.Invoke<string>(Constant.Animation.Play, getDamage.Value);
}
private void UpdateMeshState()
@@ -170,7 +180,7 @@ namespace BITKit.Entities.Player.Character
{
x.shadowCastingMode = shadowMode;
}
foreach (var x in _tpvRendererGroup)
foreach (var x in tpvOverrideRenderers)
{
x.shadowCastingMode =
_entityOverride is not null
@@ -179,33 +189,44 @@ namespace BITKit.Entities.Player.Character
}
}
[BIT]
private async void Rebuild()
private void OnCosmeticsChanged()
{
_lock = true;
BITAppForUnity.ThrowIfNotPlaying();
await UniTask.Delay(100);
await UniTask.SwitchToMainThread();
if (destroyCancellationToken.IsCancellationRequested) return;
fpvRenderer.Clear();
tpvRenderer.Clear();
fpvOverrideRenderers.Clear();
tpvRendererGroup.Clear();
tpvOverrideRenderers.Clear();
var _tpvOverrideRenderers = new List<Transform>();
foreach (var _tag in GetComponentsInChildren<Tag>(true))
{
if (_tag.TryGetComponent<Renderer>(out var _renderer) is false) continue;
var tags = _tag.GetTags();
if (tags.Contains(Player_Mesh_Type_TPV_Group))
_tpvOverrideRenderers.Add(_tag.transform);
if (_tag.TryGetComponent<Renderer>(out var _renderer) is false) continue;
if (tags.Contains(Player_Mesh_Type_FPV))
fpvRenderer.Add(_renderer);
if (tags.Contains(Player_Mesh_Type_TPV))
tpvRenderer.Add(_renderer);
if (tags.Contains(Player_Mesh_Type_FPVOverride))
fpvOverrideRenderers.Add(_renderer);
if (tags.Contains(Player_Mesh_Type_TPV_Group))
tpvRendererGroup.Add(_renderer);
}
var tpvRenderers = _tpvOverrideRenderers.SelectMany(x => x.GetComponentsInChildren<Renderer>(true));
tpvOverrideRenderers.Clear();
tpvOverrideRenderers.AddRange(tpvRenderers);
UpdateMeshState();
allowFPVOverride.Invoke();
_lock = false;
_isDirty = false;
}
private void SetDirty(bool any) => SetDirty();
private void SetDirty()
{
_freezeInterval.Reset();
_isDirty = true;
}
}
}