158 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			158 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | using System; | |||
|  | using System.Collections; | |||
|  | using System.Collections.Generic; | |||
|  | using UnityEngine; | |||
|  | 
 | |||
|  | public class SoldierUnit : WarUnit | |||
|  | { | |||
|  |     public bool HasAttackableTarget => AttackTarget.Count > 0 && AttackTarget[0] != null; | |||
|  | 
 | |||
|  |     [Header("State")] | |||
|  |     public string CurrentState; | |||
|  | 
 | |||
|  |     [Header("Targets")] | |||
|  |     public WarUnit MoveTarget; | |||
|  |     public WarUnit ShootTarget; | |||
|  |     public List<WarUnit> AttackTarget; | |||
|  | 
 | |||
|  |     private Rigidbody mBody; | |||
|  |     private CapsuleCollider mCollider; | |||
|  |     private FSM<SoldierUnit> mFSM; | |||
|  |     private AvatarGroup mAvatar; | |||
|  | 
 | |||
|  |     private bool mActive = false; | |||
|  | 
 | |||
|  |     private Vector3 mMovePos = Vector3.zero; | |||
|  |     [SerializeField]private Vector3 mVelocity = Vector3.zero; | |||
|  | 
 | |||
|  |     private HudHp mHpBar; | |||
|  | 
 | |||
|  |     protected override void AwakeInit() | |||
|  |     { | |||
|  |         AttackTarget = new List<WarUnit>(); | |||
|  | 
 | |||
|  |         mBody = GetComponent<Rigidbody>(); | |||
|  |         mCollider = GetComponent<CapsuleCollider>(); | |||
|  |         mFSM = new FSM<SoldierUnit>(this); | |||
|  |         mAvatar = gameObject.AddComponent<AvatarGroup>(); | |||
|  | 
 | |||
|  |         Freeze(); | |||
|  |     } | |||
|  | 
 | |||
|  |     private void FixedUpdate() | |||
|  |     { | |||
|  |         if (!mActive) | |||
|  |             return; | |||
|  | 
 | |||
|  |         if (mFSM != null) | |||
|  |         { | |||
|  |             mFSM.Execute(Time.fixedDeltaTime); | |||
|  |             CurrentState = mFSM.CurrentState; | |||
|  |         } | |||
|  | 
 | |||
|  |         if (mBody != null) | |||
|  |         { | |||
|  |             mBody.velocity = mVelocity; | |||
|  |             mVelocity = Vector3.zero; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     public void Active() | |||
|  |     { | |||
|  |         mActive = true; | |||
|  |         mBody.isKinematic = false; | |||
|  |         mCollider.enabled = true; | |||
|  | 
 | |||
|  |         mFSM.ChangeState(typeof(SoldierStateRun)); | |||
|  | 
 | |||
|  |         mHpBar = UIManager.Instance.GetUI<PanelGame>().CreateHudHp(mTrans, Utils.GetHpHOffset(BType, Level), Group == GroupType.Enemy, Utils.GetHpScale(BType, Level)); | |||
|  |         mHpBar.gameObject.SetActive(false); | |||
|  |     } | |||
|  | 
 | |||
|  |     public void Freeze() | |||
|  |     { | |||
|  |         mActive = false; | |||
|  |         mBody.isKinematic = true; | |||
|  |         mCollider.enabled = false; | |||
|  |     } | |||
|  | 
 | |||
|  |     public void Win() | |||
|  |     { | |||
|  |         mFSM.ChangeState(typeof(SoldierStateWin)); | |||
|  |     } | |||
|  | 
 | |||
|  |     public void SetACTrigger(SoldierACTrigger pTrigger, float pSpeed = 1) | |||
|  |     { | |||
|  |         mAvatar.SetACTrigger(pTrigger, pSpeed); | |||
|  |     } | |||
|  | 
 | |||
|  |     public void LookToTarget(Vector3 pTargetPos) | |||
|  |     { | |||
|  |         pTargetPos.y = mTrans.position.y; | |||
|  |         mTrans.LookAt(pTargetPos); | |||
|  |     } | |||
|  | 
 | |||
|  |     public void MoveToTarget(float pDeltaTime) | |||
|  |     { | |||
|  |         if (MoveTarget == null || MoveTarget.IsDead) | |||
|  |             return; | |||
|  | 
 | |||
|  |         Vector3 tMyPos = RelativePos(); | |||
|  |         mMovePos = MoveTarget.RelativePos(tMyPos); | |||
|  |         MoveToPos(pDeltaTime); | |||
|  |     } | |||
|  | 
 | |||
|  |     public void MoveToPos(float pDeltaTime) | |||
|  |     { | |||
|  |         Vector3 tMyPos = RelativePos(); | |||
|  |         LookToTarget(mMovePos); | |||
|  | 
 | |||
|  |         Vector3 tDir = mMovePos - tMyPos; | |||
|  |         tDir.y = 0; | |||
|  |         mVelocity = tDir.normalized * MoveSpeed * pDeltaTime; | |||
|  |     } | |||
|  | 
 | |||
|  |     public void StopMoving() | |||
|  |     { | |||
|  |         mVelocity = Vector3.zero; | |||
|  |     } | |||
|  | 
 | |||
|  |     protected override void HandleHurt(int pDamage) | |||
|  |     { | |||
|  |         mHpBar.gameObject.SetActive(true); | |||
|  |         mHpBar.RefreshHp((float)mCurHp / MaxHP); | |||
|  | 
 | |||
|  |         VibrateManager.Instance.Vibrate(VibrateType.Light); | |||
|  |     } | |||
|  | 
 | |||
|  |     protected override void HandleDie() | |||
|  |     { | |||
|  |         Freeze(); | |||
|  |         mFSM.ChangeState(typeof(SoldierStateDead)); | |||
|  |         mHpBar.gameObject.SetActive(false); | |||
|  | 
 | |||
|  |         Utils.DelayHideGameObject(gameObject, 3); | |||
|  |     } | |||
|  | 
 | |||
|  |     private void OnCollisionEnter(Collision pCollision) | |||
|  |     { | |||
|  |         GameObject tHitOb = pCollision.gameObject; | |||
|  |         WarUnit tUnit = tHitOb.GetComponent<WarUnit>(); | |||
|  |          | |||
|  |         if (tUnit != null && Group != tUnit.Group && !AttackTarget.Contains(tUnit)) | |||
|  |         { | |||
|  |             AttackTarget.Add(tUnit); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     private void OnCollisionExit(Collision pCollision) | |||
|  |     { | |||
|  |         GameObject tHitOb = pCollision.gameObject; | |||
|  |         WarUnit tUnit = tHitOb.GetComponent<WarUnit>(); | |||
|  | 
 | |||
|  |         if (tUnit != null && Group != tUnit.Group && AttackTarget.Contains(tUnit)) | |||
|  |         { | |||
|  |             AttackTarget.Remove(tUnit); | |||
|  |         } | |||
|  |     } | |||
|  | } |