unity实现 动作游戏的连招/连击

摘要:
privatestaticreadonlyintAttackCombo=Animator.StringToHash(“attakCombo”);MaxComboDelay){clickNum=0;}}publicvoid ClearComboClickNum(){clickNum=0;}}行为系统。动画集合;

工程下载:https://files.cnblogs.com/files/sanyejun/ComboAttack.7z

全网也没查到比较好的资料,自己弄了个

一共是3个脚本

先上图

unity实现 动作游戏的连招/连击第1张

 黑色为触发条件

绿色和红色为2个动画Behaviour脚本

注意:attack01  attack02    attack03  ——> idle  的has exit time 需要勾选上,其他的都不用

然后attack01 可以连到 attack02 , attack02 可以连到 attack03

那么attack01 和 attack02  需要在动画转折的地方添加动画事件

一个动作

【1.起手】--------------【2.攻击】--------------【3.准备收招转idle】---------------【4.转idle】

那么在 3 这个时间点,添加动画事件,如果可以连击,进入下一个攻击动作,没有的话则进入idle

添加事件:ComboCheck   参数:Int  如果需要2下进下个动作则填 2,   3下则填3

我们这里的attack01 填参数2     attack03填参数3

unity实现 动作游戏的连招/连击第2张

 脚本:

挂人物身上的

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

public class ComboAttack : MonoBehaviour
{
    public Animator anim;
    public int clickNum = 0;
    private float lastClickedTime = 0;
    //2下连击之间按键的最长延迟
    public float maxComboDelay = 0.9f;
    private static readonly int AttackCombo = Animator.StringToHash("attackCombo");

    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Time.time - lastClickedTime > maxComboDelay)
        {
            clickNum = 0;
        }

        if (Input.GetMouseButtonDown(0))
        {
            lastClickedTime = Time.time;
            clickNum++;
            if (clickNum == 1)
            {
                anim.SetBool(AttackCombo, true);
            }

            clickNum = Mathf.Clamp(clickNum, 0, 3);
        }
    }

    public void ComboCheck(int num)
    {
        if (clickNum >= num)
        {
            anim.SetBool(AttackCombo, true);
        }
    }

    public void ClearComboClickNum()
    {
        clickNum = 0;
    }
}

动画的Behaviour

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

public class AttackComboNumClear : StateMachineBehaviour
{
    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.GetComponent<ComboAttack>().ClearComboClickNum();
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AttackComboBehaviour : StateMachineBehaviour
{
    private static readonly int Attack = Animator.StringToHash("attackCombo");

    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.SetBool(Attack, false);
    }
}

免责声明:文章转载自《unity实现 动作游戏的连招/连击》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Xcode的简单使用【转】Delphi XE5中TListBox的使用方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

UE4_攻击伤害2_AI受击动画

新建一个简单的Ai, 给他添加上模型并调整至正确,修改碰撞设置。 visibility默认是忽略的,可以调整到阻挡,这样就能阻挡我们发出的射线。 这是一种阻挡射线的方法,但并不打算用这种。所以把visibility调回去。 在项目设置的collision里找到射线,新建一个射线命名为attack,并且默认相应改成 ignore 找到SimpleAI...

CSS3动画

animation动画通过设置多个节点来精确控制一个或者一组动画,常用来实现复杂的动画效果;相对过渡动画,animation动画可以实现更多变化,更多控制,实现自动播放等效果; 定义动画 制作animation动画需要两个步骤: 第一步,需要先定义动画,0%的时候我们一般建议什么也不要设置,默认就是初始的样式;         @keyframes 动画名...

跨域问题出现原因和解决方案

一、出现原因 跨域是指a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,或是a页面为ip地址,b页面为域名地址,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。 例如: URL 说明 是否跨域 http://www.a.com/lab/a.jshttp://www.a.com/s...

杨中科 向HtmlAgilityPack道歉:解析HTML还是你好用

去年写过一篇文章《解析HTML最好的类还是微软自己的》,回复中有朋友提到可以使用HtmlAgilityPack来进行HTML的解析。当时只是匆匆的测试了一下,发现HtmlAgilityPack得到的InnerText中有很多的不干净的script、样式内容,就断定“不是很满意,解析DiscuzNT!论坛的帖子页面的时候有问题,没法正确得到Body.Inne...

常用的js跳转页面方法实现汇总

1.window.location.href方式 <script language="javascript" type="text/javascript"> window.location.href="target.jsp"; </script> 2.window.navigate方式跳转 <scri...

关于html5 -- plus Webview模块管理应用窗口界面

Webview模块管理应用窗口界面,通过plus.webview可获取应用界面管理对象。 方法: all:获取所有的webview窗口 close:关闭webview窗口 create:创建新的webview窗口 currentWebview:获取当前窗口的webviewObject对象 getWebviewById:查找指定标识的webviewObje...