[RPG游戏开发日志] 构建简易战斗系统(一)

引言: 本系列将记录笔者在开发一款俯视角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()中即可:

感谢阅读 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值