using DG.Tweening; using Spine.Unity; using UnityEngine; // 전투용 캐릭터. public class IVCharacter2 : CreatureBase { [SerializeField] protected Spine.Skeleton skeleton; protected MeshRenderer mrendAnim; protected MaterialPropertyBlock mpbAnim; private int attackState = 0; protected ParticleSystem ptcSwing; protected ParticleSystem ptcSwing2; protected override void Start() { base.Start(); skeleton = skAnim.Skeleton; mrendAnim = skAnim.GetComponent(); mpbAnim = new MaterialPropertyBlock(); mpbAnim.SetTexture(GlobalShaderProperty._mainTexPropertyID, mrendAnim.sharedMaterial.mainTexture); ptcSwing = transform.Find("ptcSlash").GetComponent(); ptcSwing2 = transform.Find("ptcSlash2").GetComponent(); } protected override void InitTween() { twcSummon = transform.DOScale(Global.V3_1, 0.8f).SetEase(Ease.OutQuad).OnComplete(SummonEnd).SetAutoKill(false).Pause(); twcUnsummon = transform.DOScale(Global.V3_1, 0.8f).SetEase(Ease.InQuad).OnComplete(UnsummonEnd).SetAutoKill(false).Pause(); } // 사망시. protected override void OnDie() { base.OnDie(); if (bFriendly) battleMgr.DieFriendly(); else battleMgr.DieEnemy(eCreatureClass.charEnemy, 0); } // 타겟 위치 찾기. protected override void SearchTarget() { if (!IsBattleAvail()) { return; } if (BattleMgr.Instance.BattlePause) { ChangeState(eState.idle); return; } fSearchTick = 0f; iTargetIndex = battleMgr.GetTargetIndex(bFriendly); if (iTargetIndex < 0) { ChangeState(eState.idle); } else { v3TargetPos = battleMgr.GetTargetPos(bFriendly, iTargetIndex); fTargetDistance = BattleMgr.SCalcDistance(transform.position, v3TargetPos); if (stackSkillAvail.Count > 0 && stackSkillAvail.Peek() == -1) { ChangeState(eState.move); stackSkillAvail.Pop(); } else fUseSkillRange = stackSkillAvail.Count > 0 ? battleMgr.GetSkillRange(stackSkillAvail.Peek()) : 0; if (fTargetDistance <= fUseSkillRange) { CheckSkill(); } if (fTargetDistance <= fRange) { CheckAttack(); } else { ChangeState(eState.move); } } } public override void Summon(Vector3 v3pos, bool bfrontright) { base.Summon(v3pos, bfrontright); BattleMgr.SSetPetFront(bFriendly, IsLookRight); BattleMgr.SSetGuardianFront(bFriendly, IsLookRight); } public override void Summon() { // 애니메이션 로드 대기중이면 소환 안함. 로드 완료되는 타이밍에 소환. if (bLoading) { bSummonNeed = true; return; } bDead = false; bSummon = true; bAttackable = false; fAttackTick = 0f; iTargetIndex = -1; v3TargetPos = Vector3.zero; fTargetDistance = 9999f; ptcSwing.gameObject.SetActive(false); ptcSwing2.gameObject.SetActive(false); gameObject.SetActive(true); ChangeStateForce(eState.warp_in); twcSummon.Restart(); // 애니메이션이 다른 애니메이션으로 변경되면 새로 로드해야 함. if (bInitNeed) { bInitNeed = false; anState = skAnim.AnimationState; } //ChangeStateForce(eState.idle); BattleMgr.SSetPetFront(bFriendly, IsLookRight); BattleMgr.SSetGuardianFront(bFriendly, IsLookRight); } public override void Unsummon() { bSummon = true; bAttackable = false; ChangeStateForce(eState.warp_out); } public override void CheckAttack() { if (bStun) return; if (bAttackable && iTargetIndex >= 0) { ChangeFront(); ChangeState(eState.attack); if (attackState == 0) { ptcSwing.gameObject.SetActive(true); ptcSwing.Play(); attackState = 1; } else { //ChangeState(eState.attack2); ptcSwing2.gameObject.SetActive(true); ptcSwing2.Play(); attackState = 0; } skAnim.timeScale = 1.0f * motionSpeed; } else { ChangeState(eState.idle); } } public override void CheckSkill() { if (bStun) return; // 스킬이 사용 가능할 경우. if (stackSkillAvail.Count > 0 && iTargetIndex >= 0) { //스킬 사용부분 int iskillid = stackSkillAvail.Peek(); int iskillused = battleMgr.UseSkill(bFriendly, iskillid, transform, iTargetIndex, battleMgr.GetTrfTarget(bFriendly, iTargetIndex), fCrtDamCalc, iCrtRateCalc, biAtkCalc); // 스킬 사용함. if (iskillused > 0) { stackSkillAvail.Pop(); //ChangeState(eState.skill); return; } if(iskillused == -2) { ChangeState(eState.move); return; } // 사용할 수 없는 스킬. if (iskillused < 0) { stackSkillAvail.Pop(); } } } #region Ani Event public override void AttackDamage() { if (BattleMgr.Instance.BattlePause || bSummon || bDead) return; if (bFriendly) { battleMgr.DamageToEnemy(iTargetIndex, biAtkCalc, fCrtDamCalc, iCrtRateCalc); IVCameraController.SShakeCamera(0.1f, 0.15f); } else { battleMgr.DamageToFriendly(biAtkCalc, fCrtDamCalc, iCrtRateCalc); } } #endregion Ani Event }