BITFALL/Assets/BITKit/Unity/Scripts/Entity/Components/Character/EntityCharacter.cs

105 lines
3.4 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.Generic;
2023-11-30 00:23:23 +08:00
using System.Linq;
using BITKit.PlayerCamera;
2023-06-08 14:09:50 +08:00
using UnityEngine;
using UnityEngine.Rendering;
2023-08-27 02:58:19 +08:00
namespace BITKit.Entities.Player.Character
2023-06-08 14:09:50 +08:00
{
2023-10-30 01:25:53 +08:00
public class EntityCharacter : EntityPlayerBehavior
2023-06-08 14:09:50 +08:00
{
[Header(Constant.Header.Components)]
2023-08-27 02:58:19 +08:00
[SerializeField] private Renderer[] fpvRenderer = Array.Empty<Renderer>();
[SerializeField] private Renderer[] tpvRenderer = Array.Empty<Renderer>();
2023-11-30 00:23:23 +08:00
[SerializeField] private Renderer[] fpvOverrideRenderers = Array.Empty<Renderer>();
[SerializeField] private Transform[] tpvRendererGroup = Array.Empty<Transform>();
2023-06-08 14:09:50 +08:00
[Header(Constant.Header.Reference)]
2023-11-15 23:54:54 +08:00
[SerializeReference, SubclassSelector] public IReference getDamage;
2023-11-30 00:23:23 +08:00
[Inject(true)] private IHealth _health;
[Inject(true)] private IPlayerCameraService _cameraService;
[Inject(true)] private IEntityOverride _entityOverride;
private Renderer[] _tpvRendererGroup;
2023-06-08 14:09:50 +08:00
public override void OnStart()
{
2023-11-30 00:23:23 +08:00
if (_health is not null)
{
_health.OnSetAlive += _ => UpdateMeshState();
_health.OnSetHealthPoint += OnSetHP;
}
2023-08-23 01:59:40 +08:00
2023-11-30 00:23:23 +08:00
if (_cameraService is not null)
_cameraService.OnCameraActivated += _ => UpdateMeshState();
if(_entityOverride is not null)
_entityOverride.OnOverride += _ => UpdateMeshState();
_tpvRendererGroup = tpvRendererGroup.SelectMany(x => x.GetComponentsInChildren<Renderer>(true)).ToArray();
}
2023-08-12 01:43:24 +08:00
public override void OnPlayerInitialized()
2023-06-08 14:09:50 +08:00
{
2023-11-30 00:23:23 +08:00
UpdateMeshState();
2023-06-08 14:09:50 +08:00
}
2023-08-12 01:43:24 +08:00
public override void OnPlayerDispose()
2023-06-08 14:09:50 +08:00
{
SetFPV(false);
}
2023-08-23 01:59:40 +08:00
private void OnSetHP(int hp)
2023-06-08 14:09:50 +08:00
{
2023-11-15 23:54:54 +08:00
UnityEntity.Invoke<string>(Constant.Animation.Play, getDamage.Value);
2023-06-08 14:09:50 +08:00
}
2023-11-30 00:23:23 +08:00
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;
}
}
2023-08-23 01:59:40 +08:00
private void SetFPV(bool isFpv)
2023-06-08 14:09:50 +08:00
{
var shadowMode = isFpv ?
ShadowCastingMode.ShadowsOnly :
ShadowCastingMode.On;
foreach (var x in fpvRenderer)
{
x.enabled = isFpv;
}
foreach (var x in tpvRenderer)
{
x.shadowCastingMode = shadowMode;
}
2023-11-30 00:23:23 +08:00
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;
}
}
2023-06-08 14:09:50 +08:00
}
}
}