问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Unity动画连招的实现方式

创作时间:
作者:
@小白创作中心

Unity动画连招的实现方式

引用
CSDN
1.
https://blog.csdn.net/qq_74418765/article/details/137060218

在Unity游戏中实现动画连招是提升游戏体验的重要环节。本文将介绍三种实现动画连招的方法:使用Animator Override Controller、BlendTree以及List存储动画名称。这些方法各有特点,可以根据具体需求选择合适的方式。

一、Animator Override Controller

动画覆盖控制器是一种灵活的动画管理方式,可以通过脚本对象(ScriptableObject)来存储和管理动画数据。

  1. 使用ScriptObject存储动画数据
using UnityEngine;
[CreateAssetMenu(menuName = "Attack/CombSO")]
public class CombSO : ScriptableObject 
{
    public AnimatorOverrideController animOVC;//需要覆盖的Animator
    public float damage;
}
  1. 用List存储连击的动画数据
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu( menuName = "Attack/CombAttack")]
public class CombAttack : ScriptableObject 
{ 
    public List<CombSO> combAttackList = new List<CombSO>();  
}
  1. 创建Animator Override Controller

  2. 创建ScriptObject

  3. 赋值
    依次对其他的连击动画赋值
    对SO进行赋值
    这里是一个三段攻击的动画,可以自由的更换动画播放顺序,和连击动画次数

  4. 创建右键攻击控制代码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;
            }
        }
    }
}
  1. 获得输入
    将此段代码赋值给玩家,在控制玩家脚本中获得此组件,然后获得按键的输入在右键点击中执行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;
![](https://wy-static.wenxiaobai.com/chat-rag-image/11935568742049104627)
    [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将这些动画的名称或者条件存起来,然后在点击时更新当前播放动画即可,相关的代码逻辑上面的两种方法差不多,大家可以自行尝试一下。

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号