using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class SoldierStateShoot : BaseState { 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(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(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(); 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); } }