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(); InitColor(); } 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 (B_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 (B_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 #region Costume & Color public void InitColor() { //skeleton.FindSlot("eye").SetColor(Color.gray); //skeleton.FindSlot("hack").SetColor(Color.gray); //skeleton.FindSlot("hair_side_R").SetColor(Color.gray); //skeleton.FindSlot("hair_t").SetColor(Color.gray); //skeleton.FindSlot("hair_s").SetColor(Color.gray); //skeleton.FindSlot("hair_side_L").SetColor(Color.gray); //skeleton.FindSlot("hair_back").SetColor(Color.gray); //skeleton.FindSlot("tail_light2").SetColor(Color.gray); //skeleton.FindSlot("tail_light").SetColor(Color.gray); //skeleton.FindSlot("tail2").SetColor(Color.gray); //skeleton.FindSlot("tail1").SetColor(Color.gray); //skeleton.FindSlot("ponytail").SetColor(Color.gray); skeleton.FindSlot("star5").SetColor(Color.gray); skeleton.FindSlot("star4").SetColor(Color.gray); skeleton.FindSlot("star3").SetColor(Color.gray); skeleton.FindSlot("star2").SetColor(Color.gray); skeleton.FindSlot("star").SetColor(Color.gray); skeleton.FindSlot("bubble6").SetColor(Color.gray); skeleton.FindSlot("bubble3").SetColor(Color.gray); skeleton.FindSlot("bubble5").SetColor(Color.gray); skeleton.FindSlot("bubble2").SetColor(Color.gray); skeleton.FindSlot("bubble4").SetColor(Color.gray); skeleton.FindSlot("bubble").SetColor(Color.gray); skeleton.FindSlot("body_front_acc").SetColor(Color.gray); skeleton.FindSlot("head_acc_front").SetColor(Color.gray); skeleton.FindSlot("hair_acc_front").SetColor(Color.gray); skeleton.FindSlot("higlight").SetColor(Color.gray); skeleton.FindSlot("head").SetColor(Color.gray); skeleton.FindSlot("eyebrow").SetColor(Color.gray); skeleton.FindSlot("eye_HL").SetColor(Color.gray); skeleton.FindSlot("eye_h").SetColor(Color.gray); skeleton.FindSlot("mouse").SetColor(Color.gray); skeleton.FindSlot("head").SetColor(Color.gray); skeleton.FindSlot("arm_R").SetColor(Color.gray); skeleton.FindSlot("dress").SetColor(Color.gray); skeleton.FindSlot("upper").SetColor(Color.gray); skeleton.FindSlot("leg_R").SetColor(Color.gray); skeleton.FindSlot("lower").SetColor(Color.gray); skeleton.FindSlot("leg_L").SetColor(Color.gray); skeleton.FindSlot("hand_L").SetColor(Color.gray); skeleton.FindSlot("weapon").SetColor(Color.gray); skeleton.FindSlot("arm_L").SetColor(Color.gray); skeleton.FindSlot("body_back_acc").SetColor(Color.gray); skeleton.FindSlot("body_back_wing").SetColor(Color.gray); skeleton.FindSlot("hair_acc_back").SetColor(Color.gray); skeleton.FindSlot("hair_back_acc").SetColor(Color.gray); skeleton.FindSlot("head_acc_back").SetColor(Color.gray); skeleton.FindSlot("tail_acc").SetColor(Color.gray); skeleton.FindSlot("tail_acc2").SetColor(Color.gray); skeleton.FindSlot("shadow").SetColor(Color.gray); } public void SetHairColor(Color clr2x) { skeleton.FindSlot("hair_side_R").SetColor(clr2x); skeleton.FindSlot("hair_t").SetColor(clr2x); skeleton.FindSlot("hair_s").SetColor(clr2x); skeleton.FindSlot("hair_side_L").SetColor(clr2x); skeleton.FindSlot("hair_back").SetColor(clr2x); skeleton.FindSlot("tail_light2").SetColor(clr2x); skeleton.FindSlot("tail_light").SetColor(clr2x); skeleton.FindSlot("tail2").SetColor(clr2x); skeleton.FindSlot("tail1").SetColor(clr2x); skeleton.FindSlot("ponytail").SetColor(clr2x); } public void SetTopColor(Color clr2x) { skeleton.FindSlot("hack").SetColor(clr2x); } public void SetEyeColor(Color clr2x) { skeleton.FindSlot("eye").SetColor(clr2x); } public void SetCostume(Texture2D tx2d) { if (tx2d == null) return; mpbAnim.SetTexture(GlobalShaderProperty.MainTexPropertyID, tx2d); for (int i = 0; i < mrendAnim.sharedMaterials.Length; i++) { if (mrendAnim.sharedMaterials[i] == GameProperty.Instance.PlayerCharacterMaterial) { mrendAnim.SetPropertyBlock(mpbAnim, i); break; } } } public string GetCosInfo() { string str = FormatString.CombineAllString("mpb[", (mpbAnim.GetTexture(GlobalShaderProperty.MainTexPropertyID) == null ? "null" : mpbAnim.GetTexture(GlobalShaderProperty.MainTexPropertyID).name), "]:", mrendAnim.sharedMaterials[0].name, "::", mrendAnim.sharedMaterials[0].shader.name, ":::", (mrendAnim.sharedMaterials[0].mainTexture == null ? "null" : mrendAnim.sharedMaterials[0].mainTexture.name)); return str; } public void SetWeapon(Spine.Skin skincustom) { if (skincustom == null) return; skeleton.SetSkin(skincustom); skeleton.SetSlotsToSetupPose(); skAnim.Update(0f); } public Spine.Skeleton GetSkeleton() { return skeleton; } #endregion Costume & color }