BITFALL/Assets/Artists/Scripts/UX/UXHitmarker.cs

97 lines
2.7 KiB
C#
Raw Normal View History

2023-11-21 18:05:18 +08:00
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;
2023-12-15 00:08:02 +08:00
using BITKit.Tween;
2023-11-21 18:05:18 +08:00
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;
2023-12-16 23:30:08 +08:00
Execute(obj);
2023-11-21 18:05:18 +08:00
}
private void OnDamage(DamageMessage obj)
{
hitmarkerImage.GetVisualElement().style.unityBackgroundImageTintColor = Color.white;
Execute(obj);
}
2023-12-16 23:30:08 +08:00
private void Execute(DamageMessage obj)
2023-11-21 18:05:18 +08:00
{
if ((Entity)obj.Target == playerService.LocalPlayer) return;
if ((Entity)obj.Initiator != playerService.LocalPlayer) return;
nextHitmarkerCancellationTokenSource?.Cancel();
nextHitmarkerCancellationTokenSource = new CancellationTokenSource();
2023-12-15 00:08:02 +08:00
destroyCancellationToken.Register(nextHitmarkerCancellationTokenSource.Cancel);
2023-11-21 18:05:18 +08:00
2023-12-15 00:08:02 +08:00
var sequence = BITween.CreateSequence();
2023-12-16 23:30:08 +08:00
2023-12-15 23:44:39 +08:00
sequence.Append(UniTask.Delay(200));
2023-12-15 00:08:02 +08:00
sequence.Append(
BITween.MoveToForward(
hitmarkerImage.GetVisualElement().SetOpacity,
1, 0,0.16f
));
2024-01-27 04:09:57 +08:00
2023-12-15 00:08:02 +08:00
sequence.Play(nextHitmarkerCancellationTokenSource.Token).Forget();
var scaleSequence = BITween.CreateSequence();
scaleSequence.Append(
BITween.MoveToForward(
x=>hitmarkerImage.GetVisualElement().transform.scale = new Vector3(x,x,1),
2024-01-27 04:09:57 +08:00
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
2023-12-15 00:08:02 +08:00
));
scaleSequence.Play(nextHitmarkerCancellationTokenSource.Token).Forget();
2023-12-16 23:30:08 +08:00
2023-11-21 18:05:18 +08:00
}
}
}