using System; using System.Collections.Generic; using System.Linq; using BITKit.PlayerCamera; using UnityEngine; using UnityEngine.Rendering; namespace BITKit.Entities.Player.Character { public class EntityCharacter : EntityPlayerBehavior { [Header(Constant.Header.Components)] [SerializeField] private Renderer[] fpvRenderer = Array.Empty(); [SerializeField] private Renderer[] tpvRenderer = Array.Empty(); [SerializeField] private Renderer[] fpvOverrideRenderers = Array.Empty(); [SerializeField] private Transform[] tpvRendererGroup = Array.Empty(); [Header(Constant.Header.Reference)] [SerializeReference, SubclassSelector] public IReference getDamage; [Inject(true)] private IHealth _health; [Inject(true)] private IPlayerCameraService _cameraService; [Inject(true)] private IEntityOverride _entityOverride; private Renderer[] _tpvRendererGroup; public override void OnStart() { if (_health is not null) { _health.OnSetAlive += _ => UpdateMeshState(); _health.OnSetHealthPoint += OnSetHP; } if (_cameraService is not null) _cameraService.OnCameraActivated += _ => UpdateMeshState(); if(_entityOverride is not null) _entityOverride.OnOverride += _ => UpdateMeshState(); _tpvRendererGroup = tpvRendererGroup.SelectMany(x => x.GetComponentsInChildren(true)).ToArray(); } public override void OnPlayerInitialized() { UpdateMeshState(); } public override void OnPlayerDispose() { SetFPV(false); } private void OnSetHP(int hp) { UnityEntity.Invoke(Constant.Animation.Play, getDamage.Value); } private void UpdateMeshState() { switch (_health, _cameraService) { case (null, null): SetFPV(true); break; case (null, not null): SetFPV(_cameraService.IsCameraActivated); break; case (not null, null): SetFPV(_health.IsAlive); break; case (not null, not null): SetFPV(_health.IsAlive && _cameraService.IsCameraActivated); break; } } private void SetFPV(bool isFpv) { var shadowMode = isFpv ? ShadowCastingMode.ShadowsOnly : ShadowCastingMode.On; foreach (var x in fpvRenderer) { x.enabled = isFpv; } foreach (var x in tpvRenderer) { x.shadowCastingMode = shadowMode; } foreach (var x in _tpvRendererGroup) { x.shadowCastingMode = _entityOverride is not null ? _entityOverride.IsOvering ? ShadowCastingMode.On : shadowMode : shadowMode; } if (_entityOverride is not null) { foreach (var x in fpvOverrideRenderers) { x.enabled = isFpv && _entityOverride.IsOvering; } } } } }