using DG.Tweening; using IVDataFormat; using Spine.Unity; using System.Collections; using System.Numerics; using UnityEngine; using Vector3 = UnityEngine.Vector3; // 전투용 몬스터. public class IVMonster : CreatureBase { [SerializeField, AutoInjector("/ptcDie")] private ParticleSystem ptcDieEffect; [SerializeField, AutoInjector("/hit2")] private ParticleSystem ptcHit2; [SerializeField, AutoInjector("/hit3")] private ParticleSystem ptcHit3; // 몬스터 애니메이션 세팅. public void SetMonsterAni(SkeletonDataAsset skdata) { if (skdata == null || (skAnim.skeletonDataAsset != null && skdata.name.Equals(skAnim.skeletonDataAsset.name))) { bLoading = false; if (bSummonNeed) { bSummonNeed = false; Summon(); } return; } if (skAnim.skeletonDataAsset != null) skAnim.skeletonDataAsset.Clear(); skAnim.ClearState(); skAnim.skeletonDataAsset = skdata; skAnim.Initialize(true); ChangeStateForce(eState.idle); bInitNeed = true; bLoading = false; if (bSummonNeed) { bSummonNeed = false; Summon(); } if (BattleMgr.CurrentBattleType == BattleMgr.BattleType.GuardianDungeon) { skAnim.gameObject.SetActive(true); } else { skAnim.gameObject.SetActive(true); } } // 사망시. protected override void OnDie() { base.OnDie(); ptcHit2.Stop(); ptcHit3.Stop(); StartCoroutine(fadeOut()); PushFrameForce(10f); alertPlayer = false; battleMgr.DieEnemy(creatureClass, iIndex); } protected void KnockBack() { int ifront = 1; float pushPower = 10f; if (IsLookRight) ifront = -1; transform.DOMoveX(transform.position.x + (ifront * pushPower), 0.3f); } private IEnumerator fadeOut() { Spine.Skeleton sk = skAnim.skeleton; yield return new WaitForSeconds(0.6f); if (eType != eMonsterType.SmallObject) { ptcDieEffect.Play(); } while (sk.A > 0) { sk.A -= 0.05f; yield return new WaitForSeconds(0.05f); } yield return null; } protected override float MoveToTarget() { if (!bcoward) { if (fMovCalc <= 0f) return fTargetDistance; } Vector3 v3framepos; ChangeFront(); if (!alertPlayer) { v3framepos = Vector3.MoveTowards(transform.position, v3TargetPos, fMovCalc * enemySlowSpeed * Time.deltaTime); } else { v3framepos = Vector3.MoveTowards(transform.position, v3TargetPos, fMovCalc * Time.deltaTime); } if (bcoward) { if (v3framepos.x < -25) { v3framepos.x = -25; } if (v3framepos.x > 25) { v3framepos.x = 25; } if (v3framepos.y < -25) { v3framepos.y = -25; } if (v3framepos.y > 25) { v3framepos.y = 25; } } v3framepos.z = v3framepos.y * 0.1f; transform.position = v3framepos; fTargetDistance = Vector3.Distance(v3framepos, v3TargetPos); return fTargetDistance; } //protected override void InitTween() //{ // twcSummon = transform.DOScale(Global.V3_1, 0.4f).ChangeStartValue(Global.V3_001).SetEase(Ease.OutQuad).OnComplete(SummonEnd).SetAutoKill(false).Pause(); // twcSummonRev = transform.DOScale(Global.V3_1XRev, 0.4f).ChangeStartValue(Global.V3_001XRev).SetEase(Ease.OutQuad).OnComplete(SummonEnd).SetAutoKill(false).Pause(); // twcUnsummon = transform.DOScale(Global.V3_1, 2.0f).ChangeStartValue(Global.V3_1).SetEase(Ease.InQuad).OnComplete(UnsummonEnd).SetAutoKill(false).Pause(); // twcUnsummonRev = transform.DOScale(Global.V3_1XRev, 2.0f).ChangeStartValue(Global.V3_1XRev).SetEase(Ease.InQuad).OnComplete(UnsummonEnd).SetAutoKill(false).Pause(); //} public override void GetDamage(BigInteger biatk, float fcrtdam, int icrtrate, int idnum = -1) { base.GetDamage(biatk, fcrtdam, icrtrate, idnum); //if (!ptcHit2.isPlaying) if(eType == eMonsterType.SmalllMonster || eType == eMonsterType.MediumMonster || eType == eMonsterType.BigMonster) { ptcHit2.Play(); if(!ptcHit3.isPlaying) ptcHit3.Play(); } } // 타겟 위치 찾기. protected override void SearchTarget() { if (!IsBattleAvail()) { return; } if (BattleMgr.Instance.BattlePause) { ChangeState(eState.idle); return; } fSearchTick = 0f; v3TargetPos = battleMgr.GetTargetPos(bFriendly, iTargetIndex); fTargetDistance = BattleMgr.SCalcDistance(transform.position, v3TargetPos); if (BattleMgr.CurrentBattleType == BattleMgr.BattleType.GuardianDungeon) { fRange = 9999f; } else { fRange = 3f; } if (fTargetDistance <= fRange && biAtk != 0) { CheckAttack(); } else if(fTargetDistance <= frecogRange) { alertPlayer = true; ChangeState(eState.move); } else { ChangeState(eState.move); } } #region Ani Event public override void AttackDamage() { if (BattleMgr.Instance.BattlePause || bSummon || bDead) return; if (bFriendly) battleMgr.DamageToEnemy(iTargetIndex, biAtkCalc, fCrtDamCalc, iCrtRateCalc); else battleMgr.DamageToFriendly(biAtkCalc, fCrtDamCalc, iCrtRateCalc); } #endregion Ani Event }