using SepCore.Battle; using SepCore.Components; using SepCore.Definition; using SepCore.CustomUtility; using UnityEngine; namespace SepCore.Entity { /// /// 可作为目标的实体类。 /// public abstract class TargetableObject : EntityBase { protected abstract TargetableObjectData _targetableObjectData { get; } public bool IsDead => _healthComponent.CurrentHealth <= 0; protected HealthComponent _healthComponent; public abstract ImpactData GetImpactData(); public void ApplyDamage(EntityBase attacker, in DamageResult damageResult, Vector3? hitPosition = null) { if (damageResult.IsDodge) { _healthComponent.TakeDamage(0, false, true, hitPosition); return; } float fromHPRatio = _healthComponent.HealthRatio; _healthComponent.TakeDamage(damageResult.Damage, damageResult.IsCrit, false, hitPosition); float toHPRatio = _healthComponent.HealthRatio; if (fromHPRatio > toHPRatio) { GameEntry.HPBar.ShowHPBar(this, fromHPRatio, toHPRatio); } if (damageResult.IsLifeSteal && attacker != null) { HealthComponent attackerHealth = attacker.GetComponent(); if (attackerHealth == null && attacker is WeaponBase weapon) { attackerHealth = weapon.GetComponentInParent(); } if (attackerHealth != null) { attackerHealth.TryTriggerLifeSteal(damageResult.LifeStealAmount); } } if (_healthComponent.CurrentHealth <= 0) { OnDead(attacker); } } public void ApplyDamage(EntityBase attacker, int damageHP) { ApplyDamage(attacker, new DamageResult { Damage = damageHP, IsDodge = false, IsCrit = false, IsLifeSteal = false, LifeStealAmount = 0 }); } protected override void OnInit(object userData) { base.OnInit(userData); _healthComponent = GetComponent(); } protected override void OnShow(object userData) { base.OnShow(userData); } protected virtual void OnDead(EntityBase attacker) { GameEntry.Entity.HideEntity(this); } private void OnTriggerEnter(Collider other) { EntityBase entity = other.GetComponentInParent(); if (entity == null || entity == this) { return; } if (entity is TargetableObject && entity.Id < Id) { // 碰撞事件由 Id 大的一方处理 // 在这里约定 Enemy 的 Id 为非负数(通常从 0 开始) // 而其他的 Entity (Player, Weapon, Bullet) 的 Id 均小于 0 return; } AIUtility.PerformCollision(this, entity); } } }