【Unity】动作游戏开发实战详细分析-07-连续技与组合技功能设计


基本思路

在一些动作游戏中,存在着连续技这一功能,具体来说就是连续按下规定的按键会触发能力的功能,或者是长按触发等等。

实现解析

ComboCmd

这是命令结构体,它代表单个连续技命令

我们来逐一分析他的代码,首先,我们要明确,我们对于命令的监听基于协程,因此该命令类需要有最基本的两个方法,那就是重置和更新。

重置方法很简单,就是重置长按倒计时与限制倒计时

public ComboCmd Reset()//重置
{mLimitTime_Timer = LimitTime;mHoldTime_Timer = HoldTime;return this;
}

我们通过委托从外部输入检测条件以及时间帧长

我们来看重点的更新函数

首先他会输出一个整形变量state,用于表示当前的命令状况

每次更新时,默认初始值为等待值。如果监听条件成立,则进行时间判定,并减少长按时间,当长按时间归零,则赋予state变量成功值

这里还有一个限制时间的变量监听,它用于组合技的按键时间间隔限制

例如,目前具有组合技C+J触发行为,但是要求必须在0.2秒内完成输入。因此就需要限制时间的存在。如果连续技的两个单独命令的按键输入超过限制时间,则返回失败值

public ComboCmd Tick(out sbyte state)//每一次更新
{state = STATE_WAIT;if (Conditional())//监测条件是否成立{if (mHoldTime_Timer > 0)//是否为长按mHoldTime_Timer -= DeltaTime();else//不为长按且条件进入,则命令完成state = STATE_SUCCESS;}if (state != STATE_SUCCESS && mLimitTime_Timer > COUNTDOWN_INVALID)//更新限制时间{mLimitTime_Timer -= DeltaTime();//更新倒计时if (mLimitTime_Timer <= 0)//超过时间则失败{state = STATE_FAILURE;mLimitTime_Timer = 0;}}return this;
}

完整代码

using System;
using UnityEngine;namespace ACTBook
{public struct ComboCmd{const sbyte COUNTDOWN_INVALID = -1;//无效倒计时const sbyte STATE_SUCCESS = 1;//成功IDconst sbyte STATE_FAILURE = -1;//失败IDconst sbyte STATE_WAIT = 0;//等待IDfloat mLimitTime_Timer;//限制时间倒计时float mHoldTime_Timer;//长按时间倒计时public float LimitTime { get; set; }//限制时间public float HoldTime { get; set; }//长按时间public Func<bool> Conditional { get; set; }//检测条件(鼠标、键盘、手柄按下等)public Func<float> DeltaTime { get; set; }//两帧时间差public ComboCmd Reset()//重置{mLimitTime_Timer = LimitTime;mHoldTime_Timer = HoldTime;return this;}public ComboCmd Tick(out sbyte state)//每一次更新{state = STATE_WAIT;if (Conditional())//监测条件是否成立{if (mHoldTime_Timer > 0)//是否为长按mHoldTime_Timer -= DeltaTime();else//不为长按且条件进入,则命令完成state = STATE_SUCCESS;}if (state != STATE_SUCCESS && mLimitTime_Timer > COUNTDOWN_INVALID)//更新限制时间{mLimitTime_Timer -= DeltaTime();//更新倒计时if (mLimitTime_Timer <= 0)//超过时间则失败{state = STATE_FAILURE;mLimitTime_Timer = 0;}}return this;}}
}

WaitForComboInput

连续技命令监听类,我们需要通过协程来完成监听,因此该类需要实现IEnumerator接口

字段指令数组存储连续技指令

重点来看更新逻辑函数

首先初始化result与state

然后更新当前的命令(从index=0开始)

如果命令为失败值,则对所有命令进行重置

如果是成功值,则继续监听下一个命令,直到最后一个命令也成功时,result赋予false,表示协程暂停结束。

如果是等待值,则继续监听

bool IEnumerator.MoveNext()//更新逻辑
{var result = false;var state = STATE_FAILURE;//初始化状态mCmdArray[mCurrentIndex] = mCmdArray[mCurrentIndex].Tick(out state);//更新命令switch (state){case STATE_FAILURE://失败的情况mCurrentIndex = 0;for (int i = 0, iMax = mCmdArray.Length; i < iMax; i++)mCmdArray[i] = mCmdArray[i].Reset();//失败重置result = true;break;case STATE_SUCCESS://成功的情况mCurrentIndex++;if (mCurrentIndex == mCmdArray.Length)result = false;//若为最后一个指令协程结束elseresult = true;break;case STATE_WAIT://继续等待result = true;break;}return result;//若返回值为True则继续更新
}

完整代码

using System.Collections;namespace ACTBook
{public class WaitForComboInput : IEnumerator{const sbyte COUNTDOWN_INVALID = -1;//无效倒计时const sbyte STATE_SUCCESS = 1;//成功IDconst sbyte STATE_FAILURE = -1;//失败IDconst sbyte STATE_WAIT = 0;//等待IDint mCurrentIndex;//当前指令索引ComboCmd[] mCmdArray;//指令数组public WaitForComboInput(ComboCmd[] comboCmdArray)//初始化{mCmdArray = comboCmdArray;}object IEnumerator.Current { get { return null; } }//接口实现void IEnumerator.Reset() { mCurrentIndex = 0; }//接口实现bool IEnumerator.MoveNext()//更新逻辑{var result = false;var state = STATE_FAILURE;//初始化状态mCmdArray[mCurrentIndex] = mCmdArray[mCurrentIndex].Tick(out state);//更新命令switch (state){case STATE_FAILURE://失败的情况mCurrentIndex = 0;for (int i = 0, iMax = mCmdArray.Length; i < iMax; i++)mCmdArray[i] = mCmdArray[i].Reset();//失败重置result = true;break;case STATE_SUCCESS://成功的情况mCurrentIndex++;if (mCurrentIndex == mCmdArray.Length)result = false;//若为最后一个指令协程结束elseresult = true;break;case STATE_WAIT://继续等待result = true;break;}return result;//若返回值为True则继续更新}}
}

最后我们可以使用一个测试类,对功能进行测试

using System;
using System.Collections;
using UnityEngine;namespace ACTBook
{class Foo : MonoBehaviour{IEnumerator Start(){while (true){Func<float> deltaTime = () => Time.deltaTime;//时间间隔函数yield return new WaitForComboInput(new ComboCmd[]{new ComboCmd(){Conditional=()=>Input.GetKey(KeyCode.X), DeltaTime=deltaTime, HoldTime=-1, LimitTime=0.2f },//0.2秒内按下xnew ComboCmd(){Conditional=()=>Input.GetKey(KeyCode.Y), DeltaTime=deltaTime, HoldTime=-1, LimitTime=0.2f },//0.2秒内按下y});Debug.Log("Triggered!");//触发yield return null;}}void OnGUI(){GUILayout.Box("请在0.2秒内按下键盘'X'和'Y'按键,以触发日志打印");}}
}

【Unity】动作游戏开发实战详细分析-07-连续技与组合技功能设计相关推荐

  1. 【Unity】动作游戏开发实战详细分析-16-敌人AI设计

    [Unity]动作游戏开发实战详细分析-16-敌人AI设计 基本思想 本文来实现简单的敌人AI,使用协程来开发AI.如果想要使用行为树插件可自行学习使用. 代码实现 敌人的目标信息结构 用于存储所有的 ...

  2. 【Unity】动作游戏开发实战详细分析-06-技能系统设计

    [Unity]动作游戏开发实战详细分析-06-技能系统设计 基本思想 不同的技能可以设计为技能模版,当角色释放技能时,会通过模版ID将它进行实例化,这个实例技能类可以是一个挂载的MonoBehavio ...

  3. 【Unity】动作游戏开发实战详细分析-25-角色残影效果的实现

    [Unity]动作游戏开发实战详细分析-25-角色残影效果的实现 基本思路 Unity中的蒙皮网格组件提供了一个接口BakeMesh,允许我们拿到当前动画帧的网格数据,借此可对烘焙网格使用半透明的边缘 ...

  4. 【Unity】动作游戏开发实战详细分析-15-可扩展的战斗系统

    [Unity]动作游戏开发实战详细分析-15-可扩展的战斗系统 系统设计 攻击信息传递 通常情况下,伤害.属性.判定都会被封装到类中,在触发动画事件后将战斗信息发送给受击者. 我们可以结合Unity碰 ...

  5. 【Unity】动作游戏开发实战详细分析-24-流血喷溅程序

    [Unity]动作游戏开发实战详细分析-24-流血喷溅程序 溅落血迹效果 实现思路 利用对象池的代码设计思路,通过随机性来实现随机的溅落血迹效果. 代码 public class DripBloodF ...

  6. 五分钟详述:一文理解动作游戏开发中的攻击逻辑和受击逻辑

    前言: 本文节选自机械工业出版社出版的<Unity3D动作游戏开发实战>一书,略有改动. 攻击逻辑 一个好的操作手感对于战斗非常重要,玩家会根据当前动画状态来确定下一步输入,若手感混乱则会 ...

  7. 【游戏开发实战】Unity从零开发多人视频聊天功能,无聊了就和自己视频聊天(附源码 | Mirror | 多人视频 | 详细教程)

    文章目录 一.前言 二.思考问题与解决方案 1.思考问题 2.解决方案 2.1.Unity中如何开启摄像头并对图像进行采样 2.2.图像如何中转给其他客户端 2.3.如何实现清晰度切换 2.4.客户端 ...

  8. 《Unity 2D与3D手机游戏开发实战》简介

    #好书推荐##好书奇遇季#<Unity 2D与3D手机游戏开发实战>,京东当当天猫都有发售.彩色印制,定价89元,网店打折销售更便宜.本书配套源码.PPT课件,适合Unity游戏开发初学者 ...

  9. 《Unity 5.x游戏开发实战》一1.9 添加一个水平面

    本节书摘来异步社区<Unity 5.x游戏开发实战>一书中的第1章,第1.9节,作者: Alan Thorn 译者: 李华峰 责编: 胡俊英,更多章节内容可以访问云栖社区"异步社 ...

最新文章

  1. dump mysql database_【MySQL Database】数据迁移工具:mysqldump
  2. .团队组建及项目启动
  3. oracle plan_table,Oracle 执行计划 提示 'PLAN_TABLE' is old version 解决方法
  4. (WPF) DataGrid之绑定
  5. LocalDateTime与LocalDate之间的相互转换
  6. php中isset() , unnset(), empty()函数
  7. linux simple这个目录哪来的,Arch Linux 碎碎念
  8. commons fileupload的DiskFileItemFactory
  9. 免费下载!阿里云重磅发布《云网络白皮书》,开启云网络3.0时代
  10. android与web服务器,Android之与WEB服务器交换数据(转)
  11. IPEmotion 2022 R1支持ARINC 429数据总线标准
  12. 关于Windows勒索病毒以及445端口防护
  13. 卡方检验python程序_卡方检验及其python实现
  14. 拉格朗日乘数和KTT条件
  15. Apple Watch Ultra和Apple Watch Series 8 区别 续航 功能介绍
  16. 《转》禅意设计:网络简洁设计的缘起和未来
  17. Hive系列 (一):Hive搭建
  18. fastdfs外网上传不了文件的解决方案
  19. Android方向传感器实践——自己动手做指南针
  20. 静态代码检查工具-PMD

热门文章

  1. c 管理信息系统mysql,输入数据并输出信息的系统都称为()。A、信息系统B、数据库系统C、事务处理系统D、管理信息系统...
  2. 一个APP想法,如何做到从想法到上线的全过程操作
  3. hive-create table
  4. 基本数据类型和内置方法 08
  5. Android 中文API网址
  6. python随机森林变量重要性_推荐 :一文读懂随机森林的解释和实现(附python代码)...
  7. XXX高校数字化校园数据中心建设方案
  8. 培养工作以外的兴趣爱好很重要
  9. 【ICCV2019 论文列表】出炉论文持续更新
  10. 七类综合布线标准实施和应用