63 lines
1.5 KiB
C#
63 lines
1.5 KiB
C#
using UnityEngine;
|
|
|
|
public class ShieldGuardSkill : UnitSkill
|
|
{
|
|
[Header("盾牌参数")]
|
|
[Min(1f)]
|
|
public float shieldDurability = 220f;
|
|
|
|
[Min(0.1f)]
|
|
public float shieldDuration = 4f;
|
|
|
|
[Range(0f, 1f)]
|
|
public float damageReduction = 0.35f;
|
|
|
|
public Vector3 shieldLocalPosition = new Vector3(0f, 1f, 0.7f);
|
|
|
|
public Vector3 shieldSize = new Vector3(1.5f, 1.8f, 0.12f);
|
|
|
|
private ShieldBarrier shield;
|
|
|
|
public ShieldBarrier ActiveShield => shield;
|
|
|
|
public override void ReleaseSkill()
|
|
{
|
|
EnsureShield();
|
|
shield.Refresh(shieldDurability, shieldDuration, shieldLocalPosition, shieldSize);
|
|
}
|
|
|
|
public override float ModifyIncomingDamage(float damage, GameObject attacker)
|
|
{
|
|
if (shield == null || !shield.IsActive)
|
|
{
|
|
return damage;
|
|
}
|
|
|
|
if (shield.TryBlock(attacker, damage))
|
|
{
|
|
return damage * (1f - damageReduction);
|
|
}
|
|
|
|
return damage;
|
|
}
|
|
|
|
private void EnsureShield()
|
|
{
|
|
if (shield != null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
GameObject shieldObject = new GameObject("ShieldBarrier");
|
|
shieldObject.transform.SetParent(unit.transform, false);
|
|
|
|
BoxCollider boxCollider = shieldObject.AddComponent<BoxCollider>();
|
|
boxCollider.isTrigger = true;
|
|
boxCollider.size = shieldSize;
|
|
|
|
shield = shieldObject.AddComponent<ShieldBarrier>();
|
|
shield.Configure(unit, boxCollider);
|
|
shieldObject.SetActive(false);
|
|
}
|
|
}
|