Unity 人物连招(三段连击)

这篇具有很好参考价值的文章主要介绍了Unity 人物连招(三段连击)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一: 连招思路

首先人物角色上有三个攻击实例对象 Damage,每一个damage定义了攻击的伤害值,攻击距离,触发器名称,伤害的发起者,攻击持续时间,攻击重置时间,伤害的碰撞框大小等字段:

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

[System.Serializable]
public class Damage
{
    /// <summary>
    /// 触发动画触发器名称
    /// </summary>
    public string animationTrigger = "";
    /// <summary>
    /// 组合攻击伤害
    /// </summary>
    public int damage = 0;

    /// <summary>
    /// 伤害的攻击者
    /// </summary>
    public GameObject inflictor;
    /// <summary>
    /// 组合攻击持续时间
    /// </summary>
    public float duration = 1f;
    /// <summary>
    /// 连击重置时间 超过这个时间如果没有收到连击序列 连击将会被取消
    /// </summary>
    public float comboResetTime = .5f;

    [Space(10)]
    [Header("hit collider settings")]
    public float collSize;
    public float collDistance;

    public float collHeight;

}

当按下某一个键位的时候,播放对应索引的攻击,如果在攻击时间后再次收到了攻击键位的按下就认为是连击状态,这时候继续播放攻击动作。

二: 代码实现

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

public class PlayerCombat : MonoBehaviour
{
    // 主角的攻击组合
    public Damage[] attackCombo;
    // 主角的最后一次攻击类型
    public Damage lastAttack;
    // 记录最后一次攻击时间
    public float lastAttackTime;

    public PlayerController playerController;
    public CharactorState charactorState;
    // 最近一次攻击的索引
    public int attackIndex = 0;
    // 是否是连击状态
    public bool continueAttackCombo;

    void Awake()
    {
        playerController = GetComponent<PlayerController>();
        charactorState = GetComponent<CharactorState>();
    }

    public void combatEvent()
    {
        Debug.LogWarning("state is " + charactorState.curState);
        if (charactorState.curState != UnitState.ATTACK)
        {
            // 是否在攻击窗口内
            bool insideComboWindow = (lastAttack != null && (Time.time < (lastAttackTime + lastAttack.duration + lastAttack.comboResetTime)));

            if (insideComboWindow && !continueAttackCombo && attackIndex < attackCombo.Length - 1)
            {
                // 继续攻击
                attackIndex++;
            }
            else
            {
                // 重置攻击
                attackIndex = 0;
            }

            doAttack(attackCombo[attackIndex], UnitState.ATTACK);

        }
        if (charactorState.curState == UnitState.ATTACK && !continueAttackCombo && playerController.pc.isGround)
        {
            if (attackIndex < attackCombo.Length - 1)
            {
                // 已经处于攻击状态,且不是连续攻击 将连续攻击状态打开
                continueAttackCombo = true;
                return;
            }
        }
    }

    public void doAttack(Damage damage, UnitState state)
    {
        Debug.Log("animationTrigger is " + damage.animationTrigger);
        if (damage.animationTrigger == "attack3")
        {
            Debug.Log("attack3");
        }
        lastAttackTime = Time.time;
        lastAttack = damage;
        lastAttack.inflictor = this.gameObject;
        charactorState.SetState(state);
        playerController.playerAnimation.setTrigger(damage.animationTrigger);
        Invoke("Ready", damage.duration);
    }

    public void Ready()
    {

        Debug.LogWarning("Ready");
        if (continueAttackCombo)
        {
            // 重置是否继续连招动作 因为这个时候玩家没有触发攻击动作
            continueAttackCombo = false;
            if (attackIndex < attackCombo.Length - 1)
            {
                attackIndex++;
            }
            else
            {
                attackIndex = 0;
            }

            Debug.LogWarning("连招" + attackCombo[attackIndex].animationTrigger);

            if (attackCombo[attackIndex] != null && attackCombo[attackIndex].animationTrigger.Length > 0)
            {
                doAttack(attackCombo[attackIndex], UnitState.ATTACK);
            }
        }

        // 重置玩家状态
        charactorState.SetState(UnitState.IDLE);
    }

    // Update is called once per frame
    void Update()
    {

    }
}

三:攻击窗口

如果当前主角的状态不是攻击状态,检查是否在攻击时间窗口内,如果在攻击时间窗口内就进行攻击索引的累加,否则攻击索引从0开始文章来源地址https://www.toymoban.com/news/detail-754021.html

if (charactorState.curState != UnitState.ATTACK)
        {
            // 是否在攻击窗口内
            bool insideComboWindow = (lastAttack != null && (Time.time < (lastAttackTime + lastAttack.duration + lastAttack.comboResetTime)));

            if (insideComboWindow && !continueAttackCombo && attackIndex < attackCombo.Length - 1)
            {
                // 继续攻击
                attackIndex++;
            }
            else
            {
                // 重置攻击
                attackIndex = 0;
            }

            doAttack(attackCombo[attackIndex], UnitState.ATTACK);
return;

        }
        if (charactorState.curState == UnitState.ATTACK && !continueAttackCombo && playerController.pc.isGround)
        {
            if (attackIndex < attackCombo.Length - 1)
            {
                // 已经处于攻击状态,且不是连续攻击 将连续攻击状态打开
                continueAttackCombo = true;
                return;
            }
        }

到了这里,关于Unity 人物连招(三段连击)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(48)
  • unity中实现连击按钮切换走路与跑步

    自己个人的游戏项目中想要实现这样一个经典的效果: 当单击方向键时角色进行走动,此时速度较慢;而当连击两下方向键后角色进行跑动,此时速度较快 。那么到底要如何实现这一效果呢?当时为了实现这一效果自己也是查阅了不少博客,但似乎完整实现类似功能的并不

    2024年02月07日
    浏览(20)
  • 【Unity游戏开发教程】零基础带你从小白到超神16——四种方法控制人物移动之角色控制器

    直接修改组件位置 去资源商城下载角色控制系统成品直接拿来用 unity提供的角色控制器组件 通过物理系统自己做

    2024年02月08日
    浏览(36)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(49)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(45)
  • Unity vs Godot :哪个游戏引擎更适合你?

    游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有各自的优势,没有绝对的好坏之分。Godot开源免费,上手简单,更适合2D和小型游戏

    2024年01月23日
    浏览(70)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(46)
  • UE5 日记(人物连招:蒙太奇动画通知(含视频链接))

    教程 https://www.youtube.com/watch?v=sWpENaVGj2Mlist=PLiSlOaRBfgkcPAhYpGps16PT_9f28amXiindex=10pp=iAQB 已搭载战斗系统模块,可以收到输入指令 第一次攻击: 第一次攻击,设置Attacking为真。当连招断开时,设置Attacking未假。 若Attacking为真时,按下攻击键,想要连击,设置save attack为真;若Attacking为

    2024年02月06日
    浏览(29)
  • Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。 Kinematic 动力学刚体 动力学刚体不受重力和力的影响,而受用户的

    2023年04月24日
    浏览(99)
  • Unity和UE4两大游戏引擎,你该如何选择?

    目录 游戏引擎 2 —— 难易区别 编程语言 3 —— 游戏产品 UE4制作的游戏产品  Unity制作的游戏产品  产品类型 5 —— 资源商店 6 —— 人才需求 平均薪资 总结      Unity和UE4都是游戏引擎,所谓游戏引擎就是集成了复杂功能的游戏开发软件,他们帮我们实现了复杂的底层逻

    2023年04月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包