引言: 本系列将记录笔者在开发一款俯视角RPG游戏时涉及的开发与学习内容,笔者本科阶段并非科班,刚迈入转码硕士阶段,技术力有限,望各路大佬多多包涵
在该游戏的战斗系统中,玩家可以进行的操作分为连续四段普通攻击、特殊攻击、格挡与弹反,因此,笔者第一步将实现四段普通攻击的连击逻辑
首先声明连击信息类:
public class ComboInfo
{
public int attackID;
public float time;
public bool isFirst;
public ComboInfo(int attackID, float time, bool isFirst)
{
this.attackID = attackID;
this.time = time;
this.isFirst = isFirst;
}
}
该类包含该次攻击的攻击ID、是否连击的判定时间和该次攻击是否为第一次攻击,然后再声明一个字典来储存攻击信息,并在Start()中初始化字典,key为动画名称,第四段动画播完之后直接回到Idle状态,并声明一个atkInfo用来获取当前正在播放的动画信息,_count用来记录当前应该播放的attackID
AnimatorStateInfo atkInfo;
//comboInfo dic
public Dictionary<string, ComboInfo> dic;
//current atkID
int _count = 0;
private void Start()
{
//player attackInfo
atkInfo = _animator.GetCurrentAnimatorStateInfo(0);
dic = new Dictionary<string, ComboInfo>
{
{ "Attack_1", new ComboInfo(1, 0.5f, true) },
{ "Attack_2", new ComboInfo(2, 0.5f, false) },
{ "Attack_3", new ComboInfo(3, 0.5f, false) }
};
}
然后声明一个AttackInput方法,在玩家点击鼠标左键时修改_cout值,“canAttack”用于判断是否播放第一段攻击动画或者是否继续播放下一段攻击动画
private void AttackInput()
{
if (Input.GetMouseButtonDown(0))
{
//first attack
if (atkInfo.IsTag("Idle"))
{
_animator.SetBool("canAttack", true);
_count = 1;
}
else
{
foreach (var item in dic)
{
if (atkInfo.IsName(item.Key))
{
_count = item.Value.attackID + 1;
}
}
}
}
}
在AttackInput中先判断是否在播放Idle动画,如果是的话,直接播放第一段动画,如果不是的话,算出应当播放的ID,下一步进行判断是否能否连击,播放下一段动画:
private void AttackAction()
{
if (!atkInfo.IsTag("Idle"))
{
_animator.SetBool("Attack", false);
}
foreach (var item in dic)
{
//whether it is in the time range
if (atkInfo.IsName(item.Key) && item.Value.time < atkInfo.normalizedTime && item.Value.attackID + 1 == _count)
{
_animator.SetBool("Attack", true);
}
}
}
最终将AttackInput()和AttackAction()放入Update()中即可:
感谢阅读