引入属性、伤害管线

This commit is contained in:
2026-09-18 21:43:22 +08:00
parent 92e1ea0d55
commit ba25ec1926
108 changed files with 2920 additions and 720 deletions
@@ -28,12 +28,12 @@ namespace SepCore.DamageText
_instancePoolCapacity);
}
public void ShowDamage(Vector3 worldPosition, int damage)
public void ShowDamage(Vector3 worldPosition, int damage, bool isCrit = false, bool isDodge = false)
{
if (damage <= 0) return;
if (damage <= 0 && !isDodge) return;
DamageTextItem item = CreateDamageTextItem();
item.Show(worldPosition, damage, _canvas, OnItemComplete);
item.Show(worldPosition, damage, isCrit, isDodge, _canvas, OnItemComplete);
_activeDamageTextItems.Add(item);
}
@@ -12,6 +12,8 @@ namespace SepCore.DamageText
private const float FadeDelay = 0.2f;
private const float FadeDuration = 0.35f;
private static readonly Color NormalColor = new Color(1f, 0.32f, 0.23f, 1f);
private static readonly Color CritColor = new Color(1f, 0.85f, 0.15f, 1f);
private static readonly Color DodgeColor = new Color(0.75f, 0.75f, 0.75f, 1f);
[SerializeField] private RectTransform _cachedTransform = null;
@@ -22,7 +24,7 @@ namespace SepCore.DamageText
private Sequence _sequence;
private Action<DamageTextItem> _onComplete;
public void Show(Vector3 worldPosition, int damage, Canvas canvas, Action<DamageTextItem> onComplete)
public void Show(Vector3 worldPosition, int damage, bool isCrit, bool isDodge, Canvas canvas, Action<DamageTextItem> onComplete)
{
_onComplete = onComplete;
gameObject.SetActive(true);
@@ -30,8 +32,27 @@ namespace SepCore.DamageText
_canvasGroup.alpha = 1f;
_cachedTransform.localScale = Vector3.one;
_text.color = NormalColor;
_text.text = damage.ToString();
Vector3 punchScale;
if (isDodge)
{
_text.color = DodgeColor;
_text.text = "MISS";
punchScale = new Vector3(0.1f, 0.1f, 0f);
}
else if (isCrit)
{
_text.color = CritColor;
_text.text = damage.ToString() + "!";
_cachedTransform.localScale = new Vector3(1.3f, 1.3f, 1f);
punchScale = new Vector3(0.35f, 0.35f, 0f);
}
else
{
_text.color = NormalColor;
_text.text = damage.ToString();
punchScale = new Vector3(0.15f, 0.15f, 0f);
}
Vector3 screenPos = GameEntry.Scene.MainCamera.WorldToScreenPoint(worldPosition);
RectTransformUtility.ScreenPointToLocalPointInRectangle((RectTransform)canvas.transform, screenPos,
@@ -42,11 +63,16 @@ namespace SepCore.DamageText
_sequence = DOTween.Sequence();
_sequence.Append(_cachedTransform.DOAnchorPosY(localPos.y + RiseDistance, RiseDuration)
.SetEase(Ease.OutQuad));
_sequence.Join(_cachedTransform.DOPunchScale(new Vector3(0.15f, 0.15f, 0f), 0.18f, 6, 0.75f));
_sequence.Join(_cachedTransform.DOPunchScale(punchScale, 0.18f, 6, 0.75f));
_sequence.Join(_canvasGroup.DOFade(0f, FadeDuration).SetDelay(FadeDelay));
_sequence.OnComplete(() => _onComplete(this));
}
public void Show(Vector3 worldPosition, int damage, Canvas canvas, Action<DamageTextItem> onComplete)
{
Show(worldPosition, damage, false, false, canvas, onComplete);
}
public void ResetItem()
{
KillSequence();
@@ -35,7 +35,8 @@ namespace SepCore.CustomComponent
"tbspriteconfig",
"tbuiformconfig",
"tbuisoundconfig",
"tbweaponconfig"
"tbweaponconfig",
"tbstatconfig"
};
private sealed class TableAccessor
@@ -133,6 +134,11 @@ namespace SepCore.CustomComponent
Accessor(tables => id => tables.TbWeaponConfig.GetOrDefault((WeaponType)id),
tables => tables.TbWeaponConfig.DataList)
},
{
typeof(StatConfig),
Accessor(tables => id => tables.TbStatConfig.GetOrDefault((StatType)id),
tables => tables.TbStatConfig.DataList)
},
};
private static TableAccessor Accessor<TValue>(Func<Tables, Func<int, object>> rowGetterFactory,
@@ -1,3 +1,4 @@
using SepCore.Battle;
using SepCore.Components;
using SepCore.Debugger;
using SepCore.CustomUtility;
@@ -143,16 +144,22 @@ namespace SepCore.Simulation
return false;
}
damage = AIUtility.CalcDamageHP(sourceImpact.AttackBase, sourceImpact.AttackStat,
targetImpact.DefenseStat,
targetImpact.DodgeStat);
shouldDispatchPresentation = true;
if (damage <= 0)
DamageContext context = new DamageContext
{
return true;
}
BaseDamage = sourceImpact.AttackBase,
DamageScalingStat = sourceImpact.DamageType.ToScalingStat(),
ScalingRatio = sourceImpact.ScalingRatio,
BaseCritChance = sourceImpact.BaseCritChance,
CritMultiplier = sourceImpact.CritMultiplier,
AttackerPipeline = sourceImpact.AttributeProvider,
DefenderPipeline = targetImpact.AttributeProvider
};
target.ApplyDamage(attacker ?? sourceEntity ?? ownerEntity, damage);
DamageResult result = DamagePipeline.Calculate(in context);
damage = result.Damage;
shouldDispatchPresentation = true;
target.ApplyDamage(attacker ?? sourceEntity ?? ownerEntity, in result, hitPosition);
return true;
}
@@ -18,6 +18,7 @@ namespace SepCore.Simulation
[SerializeField]
private bool _projectileHitMarkerEnabled = true;
#pragma warning disable CS0414
[Tooltip("命中标记尺寸。")][SerializeField] private float _projectileHitMarkerSize = 0.2f;
[Tooltip("命中标记在目标上的高度偏移。")]
@@ -27,6 +28,7 @@ namespace SepCore.Simulation
[Tooltip("命中标记持续时间。")]
[SerializeField]
private float _projectileHitMarkerDuration = 0.15f;
#pragma warning restore CS0414
[Tooltip("命中标记颜色。")][SerializeField] private Color _projectileHitMarkerColor = new(1f, 0f, 0f, 0.95f);