You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

216 lines
5.9 KiB

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
}