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.
 
 
 
 
 
 

219 lines
6.1 KiB

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<MeshRenderer>();
mpbAnim = new MaterialPropertyBlock();
mpbAnim.SetTexture(GlobalShaderProperty._mainTexPropertyID, mrendAnim.sharedMaterial.mainTexture);
ptcSwing = transform.Find("ptcSlash").GetComponent<ParticleSystem>();
ptcSwing2 = transform.Find("ptcSlash2").GetComponent<ParticleSystem>();
}
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
}