Unity动画连招的实现方式
创作时间:
作者:
@小白创作中心
Unity动画连招的实现方式
引用
CSDN
1.
https://blog.csdn.net/qq_74418765/article/details/137060218
在Unity游戏中实现动画连招是提升游戏体验的重要环节。本文将介绍三种实现动画连招的方法:使用Animator Override Controller、BlendTree以及List存储动画名称。这些方法各有特点,可以根据具体需求选择合适的方式。
一、Animator Override Controller
动画覆盖控制器是一种灵活的动画管理方式,可以通过脚本对象(ScriptableObject)来存储和管理动画数据。
- 使用ScriptObject存储动画数据
using UnityEngine;
[CreateAssetMenu(menuName = "Attack/CombSO")]
public class CombSO : ScriptableObject
{
public AnimatorOverrideController animOVC;//需要覆盖的Animator
public float damage;
}
- 用List存储连击的动画数据
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu( menuName = "Attack/CombAttack")]
public class CombAttack : ScriptableObject
{
public List<CombSO> combAttackList = new List<CombSO>();
}
创建Animator Override Controller
创建ScriptObject
赋值
依次对其他的连击动画赋值
对SO进行赋值
这里是一个三段攻击的动画,可以自由的更换动画播放顺序,和连击动画次数创建右键攻击控制代码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;
}
}
}
}
- 获得输入
将此段代码赋值给玩家,在控制玩家脚本中获得此组件,然后获得按键的输入在右键点击中执行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将这些动画的名称或者条件存起来,然后在点击时更新当前播放动画即可,相关的代码逻辑上面的两种方法差不多,大家可以自行尝试一下。
总结:玩家的连击实现方式有很多种,这只是其中的三种实现方式。
玩家的攻击方式也有很多种,例如空手,剑,弓箭等,这种可以先将攻击方式先利用枚举变量存储起来,然后根据不同参数更换动画即可。
热门推荐
温榆河公园上演千灯夜:15米"灯王"领衔四大主题篇章
2025北京千灯夜元旦开启,八大主题点亮600亩灯海
2025北京温榆河千灯夜开幕,600亩超大灯会持续至明年3月
研究证实:糖尿病患者更易抑郁,6种实用方法助你情绪稳定
从教育到支持:糖尿病自我管理的最新进展与指南更新
山东省中医院联合协和专家发布糖尿病营养食谱,一周餐单全解析
掌握“五驾马车”:糖尿病患者实现病情缓解的科学方法
投资高股息资产 应避开四大“误区”
王利霞:从医18年,成长为宁夏儿童保健领域领军人物
揭秘西沙群岛:这片神秘海域只对中国公民开放
南海伏季休渔后渔获量大增:贝类增9.4倍、蟹类增3.7倍
南海中建岛:高温高湿中建成绿色堡垒,守护战略要地70年
七成以上疼痛由情绪引起,专家揭示情绪与健康的关系
我国量子计算领域获重大进展,开启算力新时代
子女陪伴、专业治疗双管齐下,有效缓解老年抑郁
高能物理首个人工智能系统"赛博士"上线
冬季办公室干眼症自救指南:科学护眼,让双眼不再干涩
护眼神器推荐:拯救干眼症
四川理小路成新晋网红公路,绝美风光引极端拥堵
十二首才女写给丈夫的诗词,尺纸从头彻尾空,忆人全在不言中
消化不良有哪些症状?如何缓解?
受限空间作业安全许可证:制度详解与案例分析
5月多起事故致多人伤亡,受限空间作业安全规范再敲警钟
化工受限空间作业安全指南:四大环节全流程管控
锦鲤文化历史及其在现代社会的地位
锦鲤文化的历史渊源与象征意义
奥地利旅游必去三城:音乐艺术与阿尔卑斯风光完美融合
奥地利十大美景:从维也纳老城到阿尔卑斯冰洞
苹果泡醋减肥法,真的有效吗?
科学饮食改善头晕胸闷,维生素C助力铁吸收