Unity动画连招的实现方式

文章介绍了在Unity中使用AnimatorOverrideController、ScriptObject和List实现角色连击动画的方法,包括使用ScriptObject存储动画数据,通过BlendTree控制动画切换,以及利用List管理动画序列。还提到了如何在RightAttack和SwordAttack脚本中实现连击逻辑和动画控制。
摘要由CSDN通过智能技术生成


可查看效果

一、Animatior Override Controller

动画覆盖控制器
1、使用ScriptObject存储动画数据

using UnityEngine;

[CreateAssetMenu(menuName = "Attack/CombSO")]
public class CombSO : ScriptableObject 
{
    public AnimatorOverrideController animOVC;//需要覆盖的Animator
    public float damage;
}

2、用List存储连击的动画数据

using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu( menuName = "Attack/CombAttack")]
public class CombAttack : ScriptableObject 
{ 
    public List<CombSO> combAttackList = new List<CombSO>();  
}

3、创建Animatior Override Controller
在这里插入图片描述

4、创建ScriptObject
在这里插入图片描述
5、赋值
在这里插入图片描述
在这里插入图片描述

依次对其他的连击动画赋值

对SO进行赋值

在这里插入图片描述

在这里插入图片描述

这里是一个三段攻击的动画,可以自由的更换动画播放顺序,和连击动画次数

6、创建右键攻击控制代码RightAttack

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RightAttack : MonoBehaviour
{
    public CombAttack rightAttackSO;//动画SO数据文件
    private Animator anim;
    private float lastClickTime;
    [Tooltip("连击时间限制")]public float comboTimeLimit;//超过此时间重置攻击次数
    [Tooltip("点击时间限制")]public float clickTimeLimit;//防止连续点按造成动画播放不连续
    private float comboTime;
    [Tooltip("当前处于第几段攻击")]public int attackCount;

    private void Awake()
    {
        anim = GetComponent<Animator>();
        attackCount = 0;
        comboTime = comboTimeLimit;
    }

    private void Update()
    {
        TimeCounter();
    }

    public void Attack()
    {
        if (Time.time - lastClickTime > clickTimeLimit && attackCount < rightAttackSO.combAttackList.Count)
        {
            anim.runtimeAnimatorController = rightAttackSO.combAttackList[attackCount].animOVC;
            attackCount++;
            if (attackCount >= rightAttackSO.combAttackList.Count)
            {
                attackCount = 0;
            }
            anim.Play("RightAttack");

            lastClickTime = Time.time;
            comboTime = comboTimeLimit;
        }
    }

    private void TimeCounter()//重置攻击动画
    {
        if (attackCount > -1)
        {
            comboTime -= Time.deltaTime;
            if (comboTime <= 0)
            {
                attackCount = 0;
                comboTime = comboTimeLimit;
            }
        }
    }
}

7、获得输入
将此段代码赋值给玩家,在控制玩家脚本中获得此组件,然后获得按键的输入在右键点击中执行RightAttack的Attack()方法即可。

二、BlendTree

在上面的代码中我们可以发现,每次点击时都会增加攻击段数,那么也可以将其与Animator中的一个Flot值关联起来,然后将这个值设置为BlendTree中切换动画的条件,再用一个SetTrigger用来触发这个BlendTree的条件,这样也可以实现连击的效果
在这里插入图片描述
在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SwordAttack : MonoBehaviour
{
    private Animator anim;
    private float lastClickTime;
    [Tooltip("连击时间限制,超过此时间重置攻击次数")]public float comboTimeLimit;
    [Tooltip("点击时间限制,防止连续点按造成动画播放不连续")]public float clickTimeLimit;
    private float comboTimer;
    [Tooltip("当前处于第几段攻击")]public int attackCount;

    private void Awake()
    {
        anim = GetComponent<Animator>();

        attackCount = -1;
        comboTimer = comboTimeLimit;
    }

    private void Update()
    {
        TimeCounter();
    }

    public void Attack()
    {
        if (Time.time - lastClickTime > clickTimeLimit)
        {
            attackCount++;
            if (attackCount > 2)
            {
                attackCount = -1;
            }
            anim.SetTrigger("swordLeftAttack");
            lastClickTime = Time.time;
            comboTimer = comboTimeLimit;
        }
    }

    private void TimeCounter()
    {
        if (attackCount > -1)
        {
            comboTimer -= Time.deltaTime;
            if (comboTimer <= 0)
            {
                attackCount = -1;
                comboTimer = comboTimeLimit;
            }
        }
    }
}

三、List

我们在使用代码播放动画的时候会发现,anim.Play(“…”)动画,或者SetTrigger相关动画时都是以字符串的形式来指定,那么在实现连击时,我们可以利用一个List将这些动画的名称或者条件存起来,然后在点击时更新当前播放动画即可,相关的代码逻辑上面的两种方法差不多,大家可以自行尝试一下。

总结:玩家的连击实现方式有很多种,这只是其中的三种实现方式。
玩家的攻击方式也有很多种,例如空手,剑,弓箭等,这种可以先将攻击方式先利用枚举变量存储起来,然后根据不同参数更换动画即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值