97 lines
2.7 KiB
C#
97 lines
2.7 KiB
C#
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<DamageMessage>(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();
|
|
|
|
}
|
|
}
|
|
|
|
}
|