using System; using System.Collections; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using BITKit; using BITKit.Entities; using BITKit.Entities.Player; using BITKit.Tween; using BITKit.UX; using Cysharp.Threading.Tasks; using UnityEngine; namespace BITFALL.UX { public class UXHitmarker : MonoBehaviour { [SerializeReference, SubclassSelector] private IPlayerService playerService; [SerializeReference, SubclassSelector] private IDamageService damageService; [SerializeField] private UXElement hitmarkerImage; private CancellationTokenSource nextHitmarkerCancellationTokenSource=new(); private void Start() { playerService.OnPlayerInitialized += OnPlayerInitialized; damageService.OnEntityDamaged += OnDamage; damageService.OnEntityKilled += OnKilled; destroyCancellationToken.Register(nextHitmarkerCancellationTokenSource.Cancel); destroyCancellationToken.Register(() => { playerService.OnPlayerInitialized -= OnPlayerInitialized; damageService.OnEntityDamaged -= OnDamage; damageService.OnEntityKilled -= OnKilled; }); hitmarkerImage.GetVisualElement().SetOpacity(0); } private void OnPlayerInitialized(Entity obj) { obj.AddListener(OnDamage); } private void OnKilled(DamageMessage obj) { hitmarkerImage.GetVisualElement().style.unityBackgroundImageTintColor = Color.red; Execute(obj); } private void OnDamage(DamageMessage obj) { hitmarkerImage.GetVisualElement().style.unityBackgroundImageTintColor = Color.white; Execute(obj); } private void Execute(DamageMessage obj) { if ((Entity)obj.Target == playerService.LocalPlayer) return; if ((Entity)obj.Initiator != playerService.LocalPlayer) return; nextHitmarkerCancellationTokenSource?.Cancel(); nextHitmarkerCancellationTokenSource = new CancellationTokenSource(); destroyCancellationToken.Register(nextHitmarkerCancellationTokenSource.Cancel); var sequence = BITween.CreateSequence(); sequence.Append(UniTask.Delay(200)); sequence.Append( BITween.MoveToForward( hitmarkerImage.GetVisualElement().SetOpacity, 1, 0,0.16f )); sequence.Play(nextHitmarkerCancellationTokenSource.Token).Forget(); var scaleSequence = BITween.CreateSequence(); scaleSequence.Append( BITween.MoveToForward( x=>hitmarkerImage.GetVisualElement().transform.scale = new Vector3(x,x,1), 1.32f, 0,0.1f )); scaleSequence.Append( BITween.MoveToForward( x=>hitmarkerImage.GetVisualElement().transform.scale = new Vector3(x,x,1), 0.16f, 1.32f,0.1f )); scaleSequence.Play(nextHitmarkerCancellationTokenSource.Token).Forget(); } } }