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.
188 lines
5.1 KiB
188 lines
5.1 KiB
using DG.Tweening;
|
|
using IVDataFormat;
|
|
using Spine.Unity;
|
|
using System.Collections;
|
|
using UnityEngine;
|
|
using Vector3 = UnityEngine.Vector3;
|
|
|
|
// 전투용 몬스터.
|
|
public class IVMonster : CreatureBase
|
|
{
|
|
private static readonly Color CLR_DamNormal = new Color(1f, 1f, 1f);
|
|
private static readonly Color CLR_DamCritical = new Color(1f, 56f / 255f, 0f);
|
|
private static readonly float F_DamNormal = 24f;
|
|
private static readonly float F_DamCritical = 32f;
|
|
|
|
[SerializeField, AutoInjector("/ptcDie")] private ParticleSystem ptcDieEffect;
|
|
[SerializeField, AutoInjector("/hit2")] private ParticleSystem ptcHit2;
|
|
[SerializeField, AutoInjector("/hit3")] private ParticleSystem ptcHit3;
|
|
|
|
[SerializeField] Transform damageIndicatorPos;
|
|
|
|
protected override void Start()
|
|
{
|
|
base.Start();
|
|
bFriendly = false;
|
|
}
|
|
|
|
// 몬스터 애니메이션 세팅.
|
|
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.updateWhenInvisible = UpdateMode.EverythingExceptMesh;
|
|
skAnim.Initialize(true);
|
|
ChangeStateForce(eState.idle);
|
|
bInitNeed = true;
|
|
bLoading = false;
|
|
|
|
if (bSummonNeed)
|
|
{
|
|
bSummonNeed = false;
|
|
Summon();
|
|
}
|
|
|
|
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 void MoveToTarget()
|
|
{
|
|
if (!bCoward && moveSpeed <= 0f || target is null) return;
|
|
|
|
Vector3 newPos;
|
|
Vector2 to = (targetPos - (Vector2)transform.position).normalized;
|
|
|
|
if (!alertPlayer)
|
|
newPos = transform.position + (Vector3)to * moveSpeed * enemySlowSpeed * Time.deltaTime;
|
|
else
|
|
newPos = transform.position + (Vector3)to * moveSpeed * Time.deltaTime;
|
|
|
|
if (bCoward)
|
|
{
|
|
if (newPos.x < -25)
|
|
newPos.x = -25;
|
|
else if (newPos.x > 25)
|
|
newPos.x = 25;
|
|
|
|
if (newPos.y < -25)
|
|
newPos.y = -25;
|
|
else if (newPos.y > 25)
|
|
newPos.y = 25;
|
|
}
|
|
newPos.z = newPos.y * 0.1f;
|
|
|
|
transform.position = newPos;
|
|
ChangeLookDirection(targetTransform);
|
|
}
|
|
|
|
protected override void OnDamaged(Damage damage)
|
|
{
|
|
var indicator = battleMgr.GetDamageIndicatorText(false);
|
|
if (indicator != null)
|
|
{
|
|
if (damage.isCritical)
|
|
indicator.SetText(FormatString.BigIntString1(damage.value), F_DamCritical, CLR_DamCritical);
|
|
else
|
|
indicator.SetText(FormatString.BigIntString1(damage.value), F_DamNormal, CLR_DamNormal);
|
|
|
|
indicator.Show(damageIndicatorPos.position);
|
|
}
|
|
|
|
if (eType == eMonsterType.SmalllMonster || eType == eMonsterType.MediumMonster || eType == eMonsterType.BigMonster)
|
|
{
|
|
ptcHit2.Play();
|
|
if(!ptcHit3.isPlaying)
|
|
ptcHit3.Play();
|
|
}
|
|
}
|
|
|
|
// 타겟 위치 찾기.
|
|
protected override void SearchTarget()
|
|
{
|
|
if (!IsBattleAvail())
|
|
{
|
|
if (battleMgr.BattlePause)
|
|
ChangeState(eState.idle);
|
|
|
|
return;
|
|
}
|
|
|
|
fSearchTick = 0f;
|
|
target = battleMgr.GetPlayer();
|
|
attackRange = 3f;
|
|
|
|
if (sqrtDistToTarget <= attackRange * attackRange && maxAtk != 0)
|
|
{
|
|
CheckAttack();
|
|
}
|
|
else if(sqrtDistToTarget <= recogRange * recogRange)
|
|
{
|
|
alertPlayer = true;
|
|
ChangeState(eState.move);
|
|
}
|
|
else
|
|
{
|
|
ChangeState(eState.move);
|
|
}
|
|
}
|
|
|
|
#region Ani Event
|
|
public override void AttackDamage()
|
|
{
|
|
if (BattleMgr.Instance.BattlePause || bSummon || bDead) return;
|
|
battleMgr.SendDamage(target, currentAtk, fCrtDamCalc, iCrtRateCalc);
|
|
}
|
|
#endregion Ani Event
|
|
}
|