前言
这篇,主要分析角色接收到技能释放的信号,执行技能释放的动作
步骤
1 角色的行为由状态机来划分,不同状态下,会执行不同操作,攻击敌人这一行为,是由等待状态-》发现目标状态-》攻击状态,
当达到目标附近后,切换成为攻击状态,接到攻击指令,执行攻击操作
public virtual void ActionAttack()
{
//进行健壮性判断
if (!this.enabled) return;
//进行逻辑判断,比如,停止走路
if (上次攻击没有结束) return;
//目标不存在,return
if (!TargetAlive(targetObj)) { TargetObjLost(); return; }
Vector3 targetDir = targetObj.transform.position - transform.position;
targetDir.y = 0;
transform.forward = Vector3.MoveTowards(transform.forward, targetDir.normalized, 0.5f);
//检测是否在技能施法范围中,
if (targetDir.magnitude < (gameRoleProperty.skillList[defaultSkillIndex].skillRange + gameRoleProperty.stepDistance + targetObj.GetComponent<GameRoleProperty>().stepDistance))
{
//判断 技能是否冷却完毕&&技能动作是否执行完毕&&上次攻击是否结束
if (roleProperty.skillList[skillIndex].skillTimeCount < 0.01f &&roleProperty.skillList[skillIndex].skillColdTimeCount < 0.01f && roleAnimator.attackEnd)
{
//进行技能执行时间的协程,在技能动作进行过程中,不会执行攻击操作
StartCoroutine(RestAffterAtaction(gameRoleProperty.skillList[skillIndex].skillColdTime));
//
roleAnimator.PlayAttack(roleProperty.skillList[skillIndex], skillIndex, targetObj);
//处理其他逻辑处理
return;
}
}
else //如果技能都不能释放,则说明不在攻击范围内,变成锁定目标状态
{
sta = GameRoleStaus.Target;
}
}
2 Animator中的PlayAttack方法,这里在说明下,技能的三个阶段,A阶段:施法者释放时的特效,B阶段:特效在施法者和目标者之间,C阶段 特效子啊目标者(攻击到了)
public virtual void PlayAttack(SkillProperty skillproperty, int skillIndex, GameObject targetobj)
{
//攻击没有结束,返回
if (!attackEnd) return;
//目标的赋值
targetObj = targetobj;
StartCoroutine(At