142 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			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;
 | |
| } |