85 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System;
 | |
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| 
 | |
| public class SoldierStateShoot : BaseState<SoldierUnit>
 | |
| {
 | |
|     private TimerUnit mShootTimer;
 | |
|     private TimerUnit mActiveTimer;
 | |
| 
 | |
|     private float mAtkAniLength = 1;
 | |
|     private GameObject mArrowPrefab;
 | |
|     
 | |
|     public override void EnterState(Type pLastState)
 | |
|     {
 | |
|         base.EnterState(pLastState);
 | |
| 
 | |
|         if (mShootTimer == null)
 | |
|         {
 | |
|             mShootTimer = TimerManager.Instance.CreateTimerUnit();
 | |
|         }
 | |
| 
 | |
|         if (mActiveTimer == null)
 | |
|         {
 | |
|             mActiveTimer = TimerManager.Instance.CreateTimerUnit();
 | |
|         }
 | |
| 
 | |
|         if (mArrowPrefab == null)
 | |
|         {
 | |
|             mArrowPrefab = ResourceManager.Instance.LoadRes<GameObject>(Const.Path.GetBullet(mMaster.BType, mMaster.Level, mMaster.Group == GroupType.Player));
 | |
|         }
 | |
| 
 | |
|         mAtkAniLength = mMaster.MetaData.AtkAniLength;
 | |
| 
 | |
|         ShootOnce();
 | |
|     }
 | |
| 
 | |
|     public override void ExecuteState(float pDeltaTime)
 | |
|     {
 | |
|         base.ExecuteState(pDeltaTime);
 | |
|     }
 | |
| 
 | |
|     public override void ExitState(Type pNextState)
 | |
|     {
 | |
|         base.ExitState(pNextState);
 | |
| 
 | |
|         mActiveTimer.CancelTimer();
 | |
|         mShootTimer.CancelTimer();
 | |
|     }
 | |
| 
 | |
|     private void ShootOnce()
 | |
|     {
 | |
|         mMaster.ShootTarget = mMaster.AgainstGroup.GetNearestTarget(mMaster.transform.position, mMaster.AtkDistance);
 | |
|         if (mMaster.ShootTarget != null && !mMaster.ShootTarget.IsDead)
 | |
|         {
 | |
|             mMaster.LookToTarget(mMaster.ShootTarget.RelativePos(mMaster.RelativePos()));
 | |
|             mMaster.SetACTrigger(SoldierACTrigger.TriggerAttack, Mathf.Max(mAtkAniLength / mMaster.AtkInterval, mAtkAniLength));
 | |
| 
 | |
|             mActiveTimer.StartTimer(ActiveOnce, Mathf.Min(mAtkAniLength * 0.6f, mMaster.AtkInterval * 0.6f));
 | |
|             mShootTimer.StartTimer(ShootOnce, mMaster.AtkInterval);
 | |
|             //mShootTimer.StartTimer(ShootOnce, Mathf.Min(mAtkAniLength, mMaster.AtkInterval));
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             ChangeState(typeof(SoldierStateIdle));
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private void ActiveOnce()
 | |
|     {
 | |
|         GameObject tAtkFx = ResourceManager.Instance.LoadRes<GameObject>(Const.Path.GetAtkFx(mMaster.BType, mMaster.Level, mMaster.Group == GroupType.Player));
 | |
|         if (tAtkFx != null)
 | |
|         {
 | |
|             Transform tFxTrans = mMaster.AtkTrans ? mMaster.AtkTrans : mMaster.transform;
 | |
|             GameObject.Instantiate(tAtkFx, tFxTrans.position, tFxTrans.rotation);
 | |
|         }
 | |
| 
 | |
|         Arrow tArrow = GameObject.Instantiate(mArrowPrefab).GetComponent<Arrow>();
 | |
| 
 | |
|         Vector3 tInitPos = mMaster.AtkTrans ? mMaster.AtkTrans.position : mMaster.RelativePos() + Vector3.up;
 | |
|         Vector3 tTargetPos = mMaster.ShootTarget.HitTrans ? mMaster.ShootTarget.HitTrans.position : mMaster.ShootTarget.RelativePos() + Vector3.up;
 | |
| 
 | |
|         tArrow.Init(Utils.CountDamage(mMaster.Level, mMaster.ShootTarget.Level, mMaster.Damage), tInitPos, tTargetPos, mMaster.ShootTarget);
 | |
|     }
 | |
| } |