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
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
|
|
}
|