这一部分跟大家分享一个游戏开发中一个必须明白的问题,那就是怎么设计按键,有哪几种按键,怎么实现?

一、按键的种类

简单来说,一般有三类,

  • press signal :键位输入等,按下时获取并更新输入
  • once trigger signal:跳跃、(非蓄力)攻击等,当玩家按下按钮时,只执行一次便结束
  • double trigger signal:连击打combo,按键较少需要区分按下一次和短时间按下两次的功能时

先考虑前面两种状态,我们可以设计一个MyButton类,专门用于获取相应的状态。

public class MyButton_TEST
{//press signalpublic bool OnPressing;//once triggerpublic bool OnPressed;public bool OnReleased;private bool curstate;private bool laststate;//double triggerpublic bool isExtending;public bool isDelaying;public void Tick(bool input){//按键输入curstate = input;OnPressing = curstate;OnPressed = false;OnReleased = false;if(curstate != laststate){if(curstate == true){OnPressed = true;}else{OnReleased = true;}}laststate = curstate;}
}

input脚本代码如下:

public class Input_TEST : MonoBehaviour
{public bool iswalk;public bool isjump;private MyButton_TEST iswalk_btn;private MyButton_TEST isjump_btn;// Start is called before the first frame updatevoid Start(){iswalk_btn = new MyButton_TEST();isjump_btn = new MyButton_TEST();}// Update is called once per framevoid Update(){iswalk_btn.Tick(Input.GetKey(KeyCode.W));isjump_btn.Tick(Input.GetKey(KeyCode.Space));iswalk = iswalk_btn.OnPressing;isjump = isjump_btn.OnPressed;print(iswalk);print(isjump);}
}

这样完整的将按钮的处理逻辑与其自身分离开来,符合里氏替换原则。untiy输出也是正确的。

下面我们来考虑double trigger的实现办法,由于double trigger需要计时操作,所以我们实现一个Mytimer类专门用来计时。

public class MyTimer_TEST
{public enum STATE{IDLE,RUN,FINISHED}public float duration;private float elapsedtime;public STATE state = STATE.IDLE;public void Tick(){switch (state){case STATE.IDLE:break;case STATE.RUN:elapsedtime += Time.deltaTime;if(elapsedtime >= duration){state = STATE.FINISHED;}break;case STATE.FINISHED:break;default:Debug.Log("Error");break;}}public void Go(){elapsedtime = 0;state = STATE.RUN;}
}

每一个button类中,应该有两种延迟信号,一种是按下后,持续多久还,一种是按下后放下,继续保持多久。说起来有点乱,可以画图表示:

对每一个按钮,我们除了设计上面所说的OnPressed、OnPressing、OnReleased三种信号外,还会设计IsExtending和IsDelaying两种信号,这两种信号的实现依赖于上面所说的Timer。

对照上图,在时间点1的位置,OnPressed信号会获得true,其他时候都为false,在2时间段也就是delayTime时间段内,IsDelaying信号为true,其他信号的表示可以参考图左侧的描述。

对此,我们重新修改一下button类的结构,增加两种信号:

public class MyButton_TEST
{//press signalpublic bool OnPressing;//once triggerpublic bool OnPressed;public bool OnReleased;private bool curstate;private bool laststate;//double triggerpublic bool isExtending;public bool isDelaying;private MyTimer_TEST extendtimer = new MyTimer_TEST();private MyTimer_TEST delaytimer = new MyTimer_TEST();public void Tick(bool input){extendtimer.Tick();delaytimer.Tick();//按键输入curstate = input;OnPressing = curstate;OnPressed = false;OnReleased = false;isExtending = false;isDelaying = false;if (curstate != laststate){if (curstate == true){OnPressed = true;StartTimer(delaytimer, 0.1f);}else{OnReleased = true;StartTimer(extendtimer, 0.1f);}}laststate = curstate;if (extendtimer.state == MyTimer_TEST.STATE.RUN){isExtending = true;}if (delaytimer.state == MyTimer_TEST.STATE.RUN){isDelaying = true;}}private void StartTimer(MyTimer_TEST timer, float duration){timer.Go();timer.duration = duration;}
}

回到input脚本中,我们测试一下,这里设计一个doublekick字段,连按两下表示一次攻击,并修改walk字段的实现要求,当玩家按下walk,松开按钮的0.2秒的时间里,我们依然认为walk==true

该设计就可以完成要求,可以在button的实现方法里将duration改为0.2即可。当然这里还可以修改一下button类,给予一个构造函数,该构造函数需要两个参数分别是delayingtime和extendingtime的值

至此就修改完毕了,完成了对button按键的抽象,以此功能可以实现各种延迟按钮、各种combo效果。

Unity制作RPG游戏——按键功能的分类与实现相关推荐

  1. Unity制作RPG游戏——相机的设计与实现

    本文将详细介绍Player的相机设计,不适用任何插件,如何制作类似RPG游戏的相机. 首先,设置正确的Hierarchy层级关系:将camPos的position和euler传递给Main Camer ...

  2. Unity制作RPG游戏——战斗注视LockOn实现方法

    一.实现步骤 1.在Input脚本中新增一个LockOn信号,显然它是Onpressed信号 2.当LockOn信号为true时,调用cameraController中的LockUpLock方法,主要 ...

  3. Unity制作RPG游戏——碰撞检测

    在介绍相机之前,有必要介绍一下碰撞检测.在unity中很多地方都需要用到碰撞检测,例如在人物的移动过程,我们需要检测角色当前是否在地面上,那么有一些比较合适的检测方案,例如物理射线等,untiy中有一 ...

  4. 使用Unity开发RPG游戏完整指南(全)

    使用Unity开发RPG游戏完整指南(全) - GameRes游资网 关注公众号 风色年代(itfantasycc) 200G Unity资料合集送上~ 本教程教大家如何使用Unity创建一个RPG游 ...

  5. Unity制作格斗游戏核心思路总结

    http://anchorart9.com/2016/05/22/unity%E5%88%B6%E4%BD%9C%E6%A0%BC%E6%96%97%E6%B8%B8%E6%88%8F%E6%A0%B ...

  6. Python——利用pygame模块制作RPG游戏(一)

    利用pygame模块制作RPG游戏(一) 需要用到的第三方库:pygame 一.构造游戏的基本框架 1.首先准备好相应的游戏素材:背景,人物动作图片,音乐,音效等. 图片均用png格式,音乐音效均用o ...

  7. 使用Unity开发RPG游戏完整指南

    本教程教大家如何使用Unity创建一个RPG游戏.类似我们之前介绍过的RPG游戏<Ghost of a Tale>,玩家可以在城镇场景中进行导航并寻找战斗,并在战斗中遇到不同类型的敌人.玩 ...

  8. unity3d制作RPG游戏系列(4)——UI界面

    个人博客文章链接:http://www.huqj.top/article?id=161 游戏中除了3d场景以外,UI界面也是很重要的一部分,例如主角的头像.血条.背包.按钮等. 下面是myrpg中的简 ...

  9. unity3d制作RPG游戏系列(1)——介绍

    个人博客文章链接:http://www.huqj.top/article?id=158 最近闲来无事,玩了几天的u3d,做了个简单的rpg游戏,打算把制作的过程还有一些坑从头到尾记录一下,本身做游戏只 ...

最新文章

  1. java数组去重_再谈JavaScript数组去重
  2. hdu oj1093题解
  3. python matplotlib.pyplot plt.ioff()函数(关闭交互模式用于阻塞程序,不让图片关闭)
  4. mysql 指定目录_mysql 更改默认数据目录
  5. scss支持的嵌套css规则
  6. 前端学习(1415):ajax的运行环境
  7. Ubuntu 16.04退出anaconda环境
  8. 求职过程记录(4)——启明星出现
  9. 阿里云_数加平台类HQL的那些坑
  10. 让xcode5能使用ios6.1模拟器
  11. OpenG数组讲解之Filter 1D Array。
  12. SkipList算法原理分析
  13. APP开发的七大阶段,你了解多少?
  14. [Qualcomm][MSM8909]APQ8009基线上编写一个OpenGl测试程序
  15. am5728 中断的使用
  16. 2023电工杯数学建模B题思路分析
  17. 流利阅读 2019.2.23 China’s Forbidden City opens to the general public at night for the first time in 94
  18. mapi java_Exchange 2010 - Exchange MAPI连接问题
  19. 06_[nvim0.5+从0单排]_Native LSP 自动补全、语法检查、code action、代码段—TypeScript篇
  20. C4D透视图设置背景图,实景合成小技巧。

热门文章

  1. Java实现 LeetCode 528 按权重随机选择(TreeMap)
  2. Thinkphp框架初始及安装部署
  3. 在阿里实习到底是一种怎样的体验?
  4. 他来了!IDEA 2020.1 新版介绍!不过升级前请注意避坑!
  5. r语言 python 金融 论文_R语言实现金融数据的时间序列分析及建模
  6. CGLIB 动态代理用例及源码解析
  7. 专利一通回案实审是什么
  8. 基于PHP+MySQL简历模板下载管理系统
  9. 《视频解密》中文版(第四版)第十章 H.261和H.263(第二部分)
  10. 深度学习 卷积神经网络原理