using System.Collections;
|
using Cysharp.Threading.Tasks;
|
using UnityEngine;
|
using UnityEngine.UI;
|
using System.Threading;
|
|
public class TotalDamageDisplayer : MonoBehaviour
|
{
|
public Image damageBackground;
|
public Text textDamage;
|
public Text textTotalDesc; //总伤害或者总治疗
|
|
public UniTask task = default;
|
|
private Coroutine hideCoroutine;
|
private int hideVersion = 0;
|
|
public void SetDamage(BattleDmgInfo dmgInfo)
|
{
|
// 先统一停止并清理此前的隐藏协程(如果有)
|
ClearHideCoroutine();
|
|
if (!gameObject.activeInHierarchy)
|
gameObject.SetActive(true);
|
|
if (dmgInfo == null)
|
return;
|
|
if (dmgInfo.IsType(DamageType.Recovery))
|
{
|
// 保持原有处理逻辑位置
|
}
|
else if (dmgInfo.IsType(DamageType.Damage) || dmgInfo.IsType(DamageType.Realdamage))
|
{
|
// 保持原有处理逻辑位置
|
}
|
|
if (dmgInfo.isLastHit)
|
{
|
// 启动新的隐藏协程,先生成新的版本号以用于协程有效性校验
|
hideVersion++;
|
int myVersion = hideVersion;
|
|
|
var battleField = BattleManager.Instance.GetBattleField(dmgInfo.battleFieldGuid);
|
|
float ms = 1000f / battleField.speedRatio;
|
|
hideCoroutine = StartCoroutine(HideAfterDelayCoroutine(ms, myVersion));
|
|
task = default;
|
}
|
}
|
|
protected void OnDisable()
|
{
|
ClearHideCoroutine();
|
hideVersion++;
|
}
|
|
protected void OnDestroy()
|
{
|
ClearHideCoroutine();
|
hideVersion++;
|
}
|
|
public void CancelHide()
|
{
|
ClearHideCoroutine();
|
hideVersion++;
|
}
|
|
private void ClearHideCoroutine()
|
{
|
if (hideCoroutine != null)
|
{
|
try { StopCoroutine(hideCoroutine); } catch { }
|
hideCoroutine = null;
|
}
|
}
|
|
private IEnumerator HideAfterDelayCoroutine(float secondsDelay, int version = 0)
|
{
|
yield return new WaitForSeconds(secondsDelay);
|
|
if (version != 0 && version != hideVersion)
|
yield break;
|
|
if (this == null) yield break;
|
if (gameObject != null)
|
gameObject.SetActive(false);
|
|
if (hideCoroutine != null)
|
hideCoroutine = null;
|
}
|
}
|