mergemilitary/Assets/Scripts/Game/Wars/WarUnit.cs

142 lines
2.5 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WarUnit : MonoBehaviour
{
public Action<WarUnit> DelDie;
public Action<int> DelHurt;
public Action<WarUnit, int> DelSplash;
public bool IsDead => mCurHp <= 0;
public Transform AtkTrans;
public Transform HitTrans;
public BlockType BType;
public int Level;
public int GroupID;
public GroupType Group;
public GroupManager AgainstGroup;
[Header("Base Attributes")]
public int MaxHP = 5;
public int Damage = 1;
public float MoveSpeed = 30;
public AttackType AtkType = AttackType.Near;
public float AtkDistance = 0;
public int AtkArea = 0;
public float AtkInterval = 1;
protected int mCurHp;
protected Transform mTrans;
private void Awake()
{
mTrans = transform;
AwakeInit();
}
protected virtual void AwakeInit()
{
}
public virtual void InitAttr(WarUnitAttr pAttr)
{
MaxHP = pAttr.MaxHP;
Damage = pAttr.Damage;
MoveSpeed = pAttr.MoveSpeed;
AtkType = pAttr.AtkType;
AtkDistance = pAttr.AtkDistance;
AtkArea = pAttr.AtkArea;
AtkInterval = pAttr.AtkInterval;
mCurHp = MaxHP;
}
public virtual Vector3 RelativePos(Vector3 pRefPos = default)
{
return mTrans.position;
}
public int Hurt(int pDamage, bool pSplash = true)
{
if (mCurHp <= 0)
return 0;
int tRealDamage = Mathf.Min(pDamage, mCurHp);
mCurHp -= pDamage;
int tOverlapDamage = mCurHp >= 0 ? 0 : Mathf.Abs(mCurHp);
mCurHp = Mathf.Max(0, mCurHp);
HandleHurt(pDamage);
DelHurt?.Invoke(tRealDamage);
if (mCurHp <= 0)
{
Die();
}
if (tOverlapDamage > 0 && pSplash)
{
DelSplash?.Invoke(this, tOverlapDamage);
}
return tOverlapDamage;
}
protected virtual void HandleHurt(int pDamage)
{
}
public void Die()
{
mCurHp = 0;
HandleDie();
DelDie?.Invoke(this);
DelDie = null;
}
protected virtual void HandleDie()
{
}
}
public enum GroupType
{
Player,
Enemy
}
public enum AttackType
{
Near,
Far
}
public class WarUnitAttr
{
public int MaxHP = 5;
public int Damage = 1;
public float MoveSpeed = 30;
public AttackType AtkType = AttackType.Near;
public float AtkDistance = 0;
public int AtkArea = 0;
public float AtkInterval = 1;
}